Socket
Socket
Sign inDemoInstall

angular-google-analytics

Package Overview
Dependencies
0
Maintainers
2
Versions
15
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.1.7 to 1.1.8

nuget.nuspec

350

dist/angular-google-analytics.js
/**
* Angular Google Analytics - Easy tracking for your AngularJS application
* @version v1.1.7 - 2016-03-25
* @version v1.1.8 - 2016-12-30
* @link http://github.com/revolunet/angular-google-analytics

@@ -12,6 +12,11 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)

'use strict';
if (typeof define === 'function' && define.amd) {
if (typeof module !== 'undefined' && module.exports) {
if (typeof angular === 'undefined') {
factory(require('angular'));
} else {
factory(angular);
}
module.exports = 'angular-google-analytics';
} else if (typeof define === 'function' && define.amd) {
define(['angular'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('angular'));
} else {

@@ -207,6 +212,6 @@ factory(root.angular);

*/
this.$get = ['$document', // To read title
'$location', //
this.$get = ['$document', // To read page title
'$location', //
'$log', //
'$rootScope',//
'$rootScope',//
'$window', //

@@ -310,2 +315,18 @@ '$injector', // To access ngRoute module without declaring a fixed dependency

var _getProtocol = function (httpPostfix, httpsPostfix) {
var protocol = '',
isSslEnabled = document.location.protocol === 'https:',
isChromeExtension = document.location.protocol === 'chrome-extension:',
isHybridApplication = analyticsJS === true && hybridMobileSupport === true;
httpPostfix = angular.isString(httpPostfix) ? httpPostfix : '';
httpsPostfix = angular.isString(httpsPostfix) ? httpsPostfix : '';
if (httpPostfix !== '') {
protocol = 'http:' + httpPostfix;
}
if (isChromeExtension || isHybridApplication || (isSslEnabled && httpsPostfix !== '')) {
protocol = 'https:' + httpsPostfix;
}
return protocol;
};
var _gaJs = function (fn) {

@@ -407,14 +428,21 @@ if (!analyticsJS && $window._gaq && typeof fn === 'function') {

/* DEPRECATED */
this._createScriptTag = function () {
if (!accounts || accounts.length < 1) {
that._log('warn', 'No account id set to create script tag');
return;
}
if (accounts.length > 1) {
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only');
accounts = accounts.slice(0, 1);
}
that._registerScriptTags();
that._registerTrackers();
};
/* DEPRECATED */
this._createAnalyticsScriptTag = function () {
that._registerScriptTags();
that._registerTrackers();
};
this._registerScriptTags = function () {
var document = $document[0],
protocol = _getProtocol(),
scriptSource;
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
that._log('warn', 'Script tags already created');
return;

@@ -424,39 +452,58 @@ }

if (disableAnalytics === true) {
that._log('info', 'Analytics disabled: ' + accounts[0].tracker);
$window['ga-disable-' + accounts[0].tracker] = true;
accounts.forEach(function (trackerObj) {
that._log('info', 'Analytics disabled: ' + trackerObj.tracker);
$window['ga-disable-' + trackerObj.tracker] = true;
});
}
_gaq('_setAccount', accounts[0].tracker);
if(domainName) {
_gaq('_setDomainName', domainName);
}
if (enhancedLinkAttribution) {
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js');
}
if (trackRoutes && !ignoreFirstPageLoad) {
if (removeRegExp) {
_gaq('_trackPageview', getUrl());
//
// Universal Analytics
//
if (analyticsJS === true) {
scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function (){
(i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);
})(window,document,'script',scriptSource,'ga');
} else {
_gaq('_trackPageview');
if (typeof $window.ga !== 'function') {
// In test mode create a ga function if none exists that is a noop sink.
$window.ga = function () {};
}
// Log script injection.
that._log('inject', scriptSource);
}
}
var document = $document[0];
var scriptSource;
if (displayFeatures === true) {
scriptSource = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
if (experimentId) {
var expScript = document.createElement('script'),
s = document.getElementsByTagName('script')[0];
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId;
s.parentNode.insertBefore(expScript, s);
}
//
// Classic Analytics
//
} else {
scriptSource = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
}
scriptSource = _getProtocol('//www', '//ssl') + '.google-analytics.com/ga.js';
if (displayFeatures === true) {
scriptSource = protocol + '//stats.g.doubleclick.net/dc.js';
}
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = scriptSource;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
} else {
// Log the source location for validation
that._log('inject', scriptSource);
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = scriptSource;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
} else {
// Log the source location for validation
that._log('inject', scriptSource);
}
}

@@ -468,127 +515,113 @@

this._createAnalyticsScriptTag = function () {
if (!accounts) {
that._log('warn', 'No account id set to create analytics script tag');
this._registerTrackers = function () {
if (!accounts || accounts.length < 1) {
that._log('warn', 'No accounts to register');
return;
}
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
return;
}
if (disableAnalytics === true) {
//
// Universal Analytics
//
if (analyticsJS === true) {
accounts.forEach(function (trackerObj) {
that._log('info', 'Analytics disabled: ' + trackerObj.tracker);
$window['ga-disable-' + trackerObj.tracker] = true;
});
}
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains;
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures;
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution;
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {};
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce;
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false;
var document = $document[0];
var protocol = hybridMobileSupport === true ? 'https:' : '';
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function (){
(i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);
})(window,document,'script',scriptSource,'ga');
} else {
if (typeof $window.ga !== 'function') {
// In test mode create a ga function if none exists that is a noop sink.
$window.ga = function () {};
}
// Log script injection.
that._log('inject', scriptSource);
}
// Logic to choose the account fields to be used.
// cookieConfig is being deprecated for a tracker specific property: fields.
var fields = {};
if (isPropertyDefined('fields', trackerObj)) {
fields = trackerObj.fields;
} else if (isPropertyDefined('cookieConfig', trackerObj)) {
if (angular.isString(trackerObj.cookieConfig)) {
fields.cookieDomain = trackerObj.cookieConfig;
} else {
fields = trackerObj.cookieConfig;
}
} else if (angular.isString(cookieConfig)) {
fields.cookieDomain = cookieConfig;
} else if (cookieConfig) {
fields = cookieConfig;
}
if (trackerObj.crossDomainLinker === true) {
fields.allowLinker = true;
}
if (isPropertyDefined('name', trackerObj)) {
fields.name = trackerObj.name;
}
trackerObj.fields = fields;
if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
_ga('create', trackerObj.tracker, trackerObj.fields);
accounts.forEach(function (trackerObj) {
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains;
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures;
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution;
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {};
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce;
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false;
// Hybrid mobile application support
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks
if (hybridMobileSupport === true) {
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null);
}
// Logic to choose the account fields to be used.
// cookieConfig is being deprecated for a tracker specific property: fields.
var fields = {};
if (isPropertyDefined('fields', trackerObj)) {
fields = trackerObj.fields;
} else if (isPropertyDefined('cookieConfig', trackerObj)) {
if (angular.isString(trackerObj.cookieConfig)) {
fields.cookieDomain = trackerObj.cookieConfig;
} else {
fields = trackerObj.cookieConfig;
// Send all custom set commands from the trackerObj.set property
for (var key in trackerObj.set) {
if (trackerObj.set.hasOwnProperty(key)) {
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]);
}
}
} else if (angular.isString(cookieConfig)) {
fields.cookieDomain = cookieConfig;
} else if (cookieConfig) {
fields = cookieConfig;
}
if (trackerObj.crossDomainLinker === true) {
fields.allowLinker = true;
}
if (isPropertyDefined('name', trackerObj)) {
fields.name = trackerObj.name;
}
trackerObj.fields = fields;
_ga('create', trackerObj.tracker, trackerObj.fields);
if (trackerObj.crossDomainLinker === true) {
_ga(generateCommandName('require', trackerObj), 'linker');
if (angular.isDefined(trackerObj.crossLinkDomains)) {
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains);
}
}
// Hybrid mobile application support
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks
if (hybridMobileSupport === true) {
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null);
}
if (trackerObj.displayFeatures) {
_ga(generateCommandName('require', trackerObj), 'displayfeatures');
}
// Send all custom set commands from the trackerObj.set property
for (var key in trackerObj.set) {
if (trackerObj.set.hasOwnProperty(key)) {
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]);
if (trackerObj.trackEcommerce) {
if (!enhancedEcommerce) {
_ga(generateCommandName('require', trackerObj), 'ecommerce');
} else {
_ga(generateCommandName('require', trackerObj), 'ec');
_ga(generateCommandName('set', trackerObj), '&cu', currency);
}
}
}
if (trackerObj.crossDomainLinker === true) {
_ga(generateCommandName('require', trackerObj), 'linker');
if (angular.isDefined(trackerObj.crossLinkDomains)) {
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains);
if (trackerObj.enhancedLinkAttribution) {
_ga(generateCommandName('require', trackerObj), 'linkid');
}
}
if (trackerObj.displayFeatures) {
_ga(generateCommandName('require', trackerObj), 'displayfeatures');
}
if (trackerObj.trackEcommerce) {
if (!enhancedEcommerce) {
_ga(generateCommandName('require', trackerObj), 'ecommerce');
} else {
_ga(generateCommandName('require', trackerObj), 'ec');
_ga(generateCommandName('set', trackerObj), '&cu', currency);
if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
}
});
//
// Classic Analytics
//
} else {
if (accounts.length > 1) {
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only');
accounts = accounts.slice(0, 1);
}
if (trackerObj.enhancedLinkAttribution) {
_ga(generateCommandName('require', trackerObj), 'linkid');
_gaq('_setAccount', accounts[0].tracker);
if(domainName) {
_gaq('_setDomainName', domainName);
}
if (enhancedLinkAttribution) {
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js');
}
if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
if (removeRegExp) {
_gaq('_trackPageview', getUrl());
} else {
_gaq('_trackPageview');
}
}
});
if (experimentId) {
var expScript = document.createElement('script'),
s = document.getElementsByTagName('script')[0];
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId;
s.parentNode.insertBefore(expScript, s);
}
created = true;
return true;

@@ -1091,7 +1124,4 @@ };

if (!delayScriptTag) {
if (analyticsJS) {
this._createAnalyticsScriptTag();
} else {
this._createScriptTag();
}
this._registerScriptTags();
this._registerTrackers();
}

@@ -1147,8 +1177,14 @@

/* DEPRECATED */
setCookieConfig: that._setCookieConfig,
setCookieConfig: function (config) {
that._log('warn', 'DEPRECATION WARNING: setCookieConfig method is deprecated. Please use tracker fields instead.');
return that._setCookieConfig.apply(that, arguments);
},
/* DEPRECATED */
getCookieConfig: function () {
that._log('warn', 'DEPRECATION WARNING: getCookieConfig method is deprecated. Please use tracker fields instead.');
return cookieConfig;
},
/* DEPRECATED */
createAnalyticsScriptTag: function (config) {
that._log('warn', 'DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.');
if (config) {

@@ -1159,5 +1195,13 @@ cookieConfig = config;

},
/* DEPRECATED */
createScriptTag: function () {
that._log('warn', 'DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.');
return that._createScriptTag();
},
registerScriptTags: function () {
return that._registerScriptTags();
},
registerTrackers: function () {
return that._registerTrackers();
},
offline: function (mode) {

@@ -1164,0 +1208,0 @@ if (mode === true && offlineMode === false) {

/**
* Angular Google Analytics - Easy tracking for your AngularJS application
* @version v1.1.7 - 2016-03-25
* @version v1.1.8 - 2016-12-30
* @link http://github.com/revolunet/angular-google-analytics

@@ -9,2 +9,2 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)

*/
!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a,b){"use strict";return a.module("angular-google-analytics",[]).provider("Analytics",function(){var c,d,e,f,g,h=!0,i="auto",j=!1,k=!1,l="USD",m=!1,n=!1,o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w=!1,x="$routeChangeSuccess",y=!1,z=!1,A=!1,B="",C=!0,D=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(d){return c=a.isUndefined(d)||d===!1?b:a.isArray(d)?d:a.isObject(d)?[d]:[{tracker:d,trackEvent:!0}],this},this.trackPages=function(a){return C=!!a,this},this.trackPrefix=function(a){return B=a,this},this.setDomainName=function(a){return e=a,this},this.useDisplayFeatures=function(a){return o=!!a,this},this.useAnalytics=function(a){return h=!!a,this},this.useEnhancedLinkAttribution=function(a){return s=!!a,this},this.useCrossDomainLinker=function(a){return k=!!a,this},this.setCrossLinkDomains=function(a){return d=a,this},this.setPageEvent=function(a){return x=a,this},this.setCookieConfig=function(a){return i=a,this},this.useECommerce=function(a,b){return q=!!a,r=!!b,this},this.setCurrency=function(a){return l=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(g=a),this},this.setExperimentId=function(a){return f=a,this},this.ignoreFirstPageLoad=function(a){return t=!!a,this},this.trackUrlParams=function(a){return D=!!a,this},this.disableAnalytics=function(a){return p=!!a,this},this.setHybridMobileSupport=function(a){return v=!!a,this},this.startOffline=function(a){return w=!!a,w===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return n=!!a,this},this.logAllCalls=function(a){return u=!!a,this},this.enterTestMode=function(){return z=!0,this},this.enterDebugMode=function(a){return m=!0,A=!!a,this},this.readFromRoute=function(a){return y=!!a,this},this.$get=["$document","$location","$log","$rootScope","$window","$injector",function(E,F,G,H,I,J){var K=this,L=function(b,c){return a.isObject(c)&&a.isDefined(c[b])},M=function(a,b,c){return L(a,b)&&b[a]===c},N=function(b,c){return a.isString(c)?c+"."+b:L("name",c)?c.name+"."+b:b},O={};y&&(J.has("$route")?O=J.get("$route"):G.warn("$route service is not available. Make sure you have included ng-route in your application dependencies."));var P=function(){if(y&&O.current&&"pageTrack"in O.current)return O.current.pageTrack;var a=D?F.url():F.path();return g?a.replace(g,""):a},Q=function(){var b={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},c={};return a.forEach(F.search(),function(d,e){var f=b[e];a.isDefined(f)&&(c[f]=d)}),c},R=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},S=function(a){!h&&I._gaq&&"function"==typeof a&&a()},T=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([T,a]):(I._gaq||(I._gaq=[]),u===!0&&K._log.apply(K,a),void I._gaq.push(a))},U=function(a){h&&I.ga&&"function"==typeof a&&a()},V=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([V,a]):"function"!=typeof I.ga?void K._log("warn","ga function not set on window"):(u===!0&&K._log.apply(K,a),void I.ga.apply(null,a))},W=function(a){var b=Array.prototype.slice.call(arguments,1),d=b[0],e=[];return"function"==typeof a?c.forEach(function(b){a(b)&&e.push(b)}):e=c,0===e.length?void V.apply(K,b):void e.forEach(function(a){L("select",a)&&"function"==typeof a.select&&!a.select(b)||(b[0]=N(d,a),V.apply(K,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":G[a[0]](a.slice(1))}K.log.push(a)}},this._createScriptTag=function(){if(!c||c.length<1)return void K._log("warn","No account id set to create script tag");if(c.length>1&&(K._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),c=c.slice(0,1)),j===!0)return void K._log("warn","ga.js or analytics.js script tag already created");p===!0&&(K._log("info","Analytics disabled: "+c[0].tracker),I["ga-disable-"+c[0].tracker]=!0),T("_setAccount",c[0].tracker),e&&T("_setDomainName",e),s&&T("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),C&&!t&&(g?T("_trackPageview",P()):T("_trackPageview"));var a,b=E[0];return a=o===!0?("https:"===b.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===b.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",z!==!0?!function(){var c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():K._log("inject",a),j=!0,!0},this._createAnalyticsScriptTag=function(){if(!c)return void K._log("warn","No account id set to create analytics script tag");if(j===!0)return void K._log("warn","ga.js or analytics.js script tag already created");p===!0&&c.forEach(function(a){K._log("info","Analytics disabled: "+a.tracker),I["ga-disable-"+a.tracker]=!0});var b=E[0],e=v===!0?"https:":"",g=e+"//www.google-analytics.com/"+(m?"analytics_debug.js":"analytics.js");if(z!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(window,b,"script",g,"ga"):("function"!=typeof I.ga&&(I.ga=function(){}),K._log("inject",g)),A&&(I.ga_debug={trace:!0}),c.forEach(function(b){b.crossDomainLinker=L("crossDomainLinker",b)?b.crossDomainLinker:k,b.crossLinkDomains=L("crossLinkDomains",b)?b.crossLinkDomains:d,b.displayFeatures=L("displayFeatures",b)?b.displayFeatures:o,b.enhancedLinkAttribution=L("enhancedLinkAttribution",b)?b.enhancedLinkAttribution:s,b.set=L("set",b)?b.set:{},b.trackEcommerce=L("trackEcommerce",b)?b.trackEcommerce:q,b.trackEvent=L("trackEvent",b)?b.trackEvent:!1;var c={};L("fields",b)?c=b.fields:L("cookieConfig",b)?a.isString(b.cookieConfig)?c.cookieDomain=b.cookieConfig:c=b.cookieConfig:a.isString(i)?c.cookieDomain=i:i&&(c=i),b.crossDomainLinker===!0&&(c.allowLinker=!0),L("name",b)&&(c.name=b.name),b.fields=c,V("create",b.tracker,b.fields),v===!0&&V(N("set",b),"checkProtocolTask",null);for(var e in b.set)b.set.hasOwnProperty(e)&&V(N("set",b),e,b.set[e]);b.crossDomainLinker===!0&&(V(N("require",b),"linker"),a.isDefined(b.crossLinkDomains)&&V(N("linker:autoLink",b),b.crossLinkDomains)),b.displayFeatures&&V(N("require",b),"displayfeatures"),b.trackEcommerce&&(r?(V(N("require",b),"ec"),V(N("set",b),"&cu",l)):V(N("require",b),"ecommerce")),b.enhancedLinkAttribution&&V(N("require",b),"linkid"),C&&!t&&V(N("send",b),"pageview",B+P())}),f){var h=b.createElement("script"),n=b.getElementsByTagName("script")[0];h.src=e+"//www.google-analytics.com/cx/api.js?experiment="+f,n.parentNode.insertBefore(h,n)}return j=!0,!0},this._ecommerceEnabled=function(a,b){var c=q&&!r;return a===!0&&c===!1&&(q&&r?K._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):K._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=q&&r;return a===!0&&c===!1&&K._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(c,d,e){c=c?c:P(),d=d?d:E[0].title,S(function(){T("_set","title",d),T("_trackPageview",B+c)}),U(function(){var f={page:B+c,title:d};a.extend(f,Q()),a.isObject(e)&&a.extend(f,e),W(b,"send","pageview",f)})},this._trackEvent=function(b,c,d,e,f,g){S(function(){T("_trackEvent",b,c,d,e,!!f)}),U(function(){var h={},i=function(a){return M("trackEvent",a,!0)};a.isDefined(f)&&(h.nonInteraction=!!f),a.isObject(g)&&a.extend(h,g),a.isDefined(h.page)||(h.page=P()),W(i,"send","event",b,c,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){S(function(){T("_addTrans",a,b,c,d,e,f,g,h)}),U(function(){if(K._ecommerceEnabled(!0,"addTrans")){var f=function(a){return M("trackEcommerce",a,!0)};W(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){S(function(){T("_addItem",a,b,c,d,e,f)}),U(function(){if(K._ecommerceEnabled(!0,"addItem")){var g=function(a){return M("trackEcommerce",a,!0)};W(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){S(function(){T("_trackTrans")}),U(function(){if(K._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return M("trackEcommerce",a,!0)};W(a,"ecommerce:send")}})},this._clearTrans=function(){U(function(){if(K._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return M("trackEcommerce",a,!0)};W(a,"ecommerce:clear")}})},this._addProduct=function(b,c,d,e,f,g,h,i,j,k){S(function(){T("_addProduct",b,c,d,e,f,g,h,i,j)}),U(function(){if(K._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return M("trackEcommerce",a,!0)},m={id:b,name:c,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};a.isObject(k)&&a.extend(m,k),W(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){S(function(){T("_addImpression",a,b,c,d,e,f,g,h)}),U(function(){if(K._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return M("trackEcommerce",a,!0)};W(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){S(function(){T("_addPromo",a,b,c,d)}),U(function(){if(K._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return M("trackEcommerce",a,!0)};W(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){S(function(){T("_setAction",a,b)}),U(function(){if(K._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return M("trackEcommerce",a,!0)};W(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",R(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",R(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",R(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a,b){-1!==["add","remove"].indexOf(a)&&(this._setAction(a,{list:b}),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",R(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){U(function(){V(N("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),U(function(){V.apply(K,a)})},this._set=function(a,b,c){U(function(){V(N("set",c),a,b)})},this._trackTimings=function(a,c,d,e){U(function(){W(b,"send","timing",a,c,d,e)})},this._trackException=function(a,c){U(function(){W(b,"send","exception",{exDescription:a,exFatal:!!c})})},n||(h?this._createAnalyticsScriptTag():this._createScriptTag()),C&&H.$on(x,function(){(!y||O.current&&O.current.templateUrl&&!O.current.doNotTrack)&&K._trackPage()}),{log:K.log,offlineQueue:K.offlineQueue,configuration:{accounts:c,universalAnalytics:h,crossDomainLinker:k,crossLinkDomains:d,currency:l,debugMode:m,delayScriptTag:n,disableAnalytics:p,displayFeatures:o,domainName:e,ecommerce:K._ecommerceEnabled(),enhancedEcommerce:K._enhancedEcommerceEnabled(),enhancedLinkAttribution:s,experimentId:f,hybridMobileSupport:v,ignoreFirstPageLoad:t,logAllCalls:u,pageEvent:x,readFromRoute:y,removeRegExp:g,testMode:z,traceDebuggingMode:A,trackPrefix:B,trackRoutes:C,trackUrlParams:D},getUrl:P,setCookieConfig:K._setCookieConfig,getCookieConfig:function(){return i},createAnalyticsScriptTag:function(a){return a&&(i=a),K._createAnalyticsScriptTag()},createScriptTag:function(){return K._createScriptTag()},offline:function(a){if(a===!0&&w===!1&&(w=!0),a===!1&&w===!0)for(w=!1;K.offlineQueue.length>0;){var b=K.offlineQueue.shift();b[0].apply(K,b[1])}return w},trackPage:function(a,b,c){K._trackPage.apply(K,arguments)},trackEvent:function(a,b,c,d,e,f){K._trackEvent.apply(K,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){K._addTrans.apply(K,arguments)},addItem:function(a,b,c,d,e,f){K._addItem.apply(K,arguments)},trackTrans:function(){K._trackTrans.apply(K,arguments)},clearTrans:function(){K._clearTrans.apply(K,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){K._addProduct.apply(K,arguments)},addPromo:function(a,b,c,d){K._addPromo.apply(K,arguments)},addImpression:function(a,b,c,d,e,f,g,h){K._addImpression.apply(K,arguments)},productClick:function(a){K._productClick.apply(K,arguments)},promoClick:function(a){K._promoClick.apply(K,arguments)},trackDetail:function(){K._trackDetail.apply(K,arguments)},trackCart:function(a,b){K._trackCart.apply(K,arguments)},trackCheckout:function(a,b){K._trackCheckOut.apply(K,arguments)},trackTimings:function(a,b,c,d){K._trackTimings.apply(K,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){K._trackTransaction.apply(K,arguments)},trackException:function(a,b){K._trackException.apply(K,arguments)},setAction:function(a,b){K._setAction.apply(K,arguments)},pageView:function(){K._pageView.apply(K,arguments)},send:function(a){K._send.apply(K,arguments)},set:function(a,b,c){K._set.apply(K,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){e.gaTrackEventIf&&!c.$eval(e.gaTrackEventIf)||f.length>1&&a.trackEvent.apply(a,f(c))})}}}]),a.module("angular-google-analytics")});
!function(a,b){"use strict";"undefined"!=typeof module&&module.exports?(b("undefined"==typeof angular?require("angular"):angular),module.exports="angular-google-analytics"):"function"==typeof define&&define.amd?define(["angular"],b):b(a.angular)}(this,function(a,b){"use strict";return a.module("angular-google-analytics",[]).provider("Analytics",function(){var c,d,e,f,g,h=!0,i="auto",j=!1,k=!1,l="USD",m=!1,n=!1,o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w=!1,x="$routeChangeSuccess",y=!1,z=!1,A=!1,B="",C=!0,D=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(d){return c=a.isUndefined(d)||d===!1?b:a.isArray(d)?d:a.isObject(d)?[d]:[{tracker:d,trackEvent:!0}],this},this.trackPages=function(a){return C=!!a,this},this.trackPrefix=function(a){return B=a,this},this.setDomainName=function(a){return e=a,this},this.useDisplayFeatures=function(a){return o=!!a,this},this.useAnalytics=function(a){return h=!!a,this},this.useEnhancedLinkAttribution=function(a){return s=!!a,this},this.useCrossDomainLinker=function(a){return k=!!a,this},this.setCrossLinkDomains=function(a){return d=a,this},this.setPageEvent=function(a){return x=a,this},this.setCookieConfig=function(a){return i=a,this},this.useECommerce=function(a,b){return q=!!a,r=!!b,this},this.setCurrency=function(a){return l=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(g=a),this},this.setExperimentId=function(a){return f=a,this},this.ignoreFirstPageLoad=function(a){return t=!!a,this},this.trackUrlParams=function(a){return D=!!a,this},this.disableAnalytics=function(a){return p=!!a,this},this.setHybridMobileSupport=function(a){return v=!!a,this},this.startOffline=function(a){return w=!!a,w===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return n=!!a,this},this.logAllCalls=function(a){return u=!!a,this},this.enterTestMode=function(){return z=!0,this},this.enterDebugMode=function(a){return m=!0,A=!!a,this},this.readFromRoute=function(a){return y=!!a,this},this.$get=["$document","$location","$log","$rootScope","$window","$injector",function(E,F,G,H,I,J){var K=this,L=function(b,c){return a.isObject(c)&&a.isDefined(c[b])},M=function(a,b,c){return L(a,b)&&b[a]===c},N=function(b,c){return a.isString(c)?c+"."+b:L("name",c)?c.name+"."+b:b},O={};y&&(J.has("$route")?O=J.get("$route"):G.warn("$route service is not available. Make sure you have included ng-route in your application dependencies."));var P=function(){if(y&&O.current&&"pageTrack"in O.current)return O.current.pageTrack;var a=D?F.url():F.path();return g?a.replace(g,""):a},Q=function(){var b={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},c={};return a.forEach(F.search(),function(d,e){var f=b[e];a.isDefined(f)&&(c[f]=d)}),c},R=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},S=function(b,c){var d="",e="https:"===document.location.protocol,f="chrome-extension:"===document.location.protocol,g=h===!0&&v===!0;return b=a.isString(b)?b:"",c=a.isString(c)?c:"",""!==b&&(d="http:"+b),(f||g||e&&""!==c)&&(d="https:"+c),d},T=function(a){!h&&I._gaq&&"function"==typeof a&&a()},U=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([U,a]):(I._gaq||(I._gaq=[]),u===!0&&K._log.apply(K,a),void I._gaq.push(a))},V=function(a){h&&I.ga&&"function"==typeof a&&a()},W=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void K.offlineQueue.push([W,a]):"function"!=typeof I.ga?void K._log("warn","ga function not set on window"):(u===!0&&K._log.apply(K,a),void I.ga.apply(null,a))},X=function(a){var b=Array.prototype.slice.call(arguments,1),d=b[0],e=[];return"function"==typeof a?c.forEach(function(b){a(b)&&e.push(b)}):e=c,0===e.length?void W.apply(K,b):void e.forEach(function(a){L("select",a)&&"function"==typeof a.select&&!a.select(b)||(b[0]=N(d,a),W.apply(K,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":G[a[0]](a.slice(1))}K.log.push(a)}},this._createScriptTag=function(){K._registerScriptTags(),K._registerTrackers()},this._createAnalyticsScriptTag=function(){K._registerScriptTags(),K._registerTrackers()},this._registerScriptTags=function(){var a,b=E[0],d=S();if(j===!0)return void K._log("warn","Script tags already created");if(p===!0&&c.forEach(function(a){K._log("info","Analytics disabled: "+a.tracker),I["ga-disable-"+a.tracker]=!0}),h===!0){if(a=d+"//www.google-analytics.com/"+(m?"analytics_debug.js":"analytics.js"),z!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(window,b,"script",a,"ga"):("function"!=typeof I.ga&&(I.ga=function(){}),K._log("inject",a)),A&&(I.ga_debug={trace:!0}),f){var e=b.createElement("script"),g=b.getElementsByTagName("script")[0];e.src=d+"//www.google-analytics.com/cx/api.js?experiment="+f,g.parentNode.insertBefore(e,g)}}else a=S("//www","//ssl")+".google-analytics.com/ga.js",o===!0&&(a=d+"//stats.g.doubleclick.net/dc.js"),z!==!0?!function(){var c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():K._log("inject",a);return j=!0,!0},this._registerTrackers=function(){return!c||c.length<1?void K._log("warn","No accounts to register"):(h===!0?c.forEach(function(b){b.crossDomainLinker=L("crossDomainLinker",b)?b.crossDomainLinker:k,b.crossLinkDomains=L("crossLinkDomains",b)?b.crossLinkDomains:d,b.displayFeatures=L("displayFeatures",b)?b.displayFeatures:o,b.enhancedLinkAttribution=L("enhancedLinkAttribution",b)?b.enhancedLinkAttribution:s,b.set=L("set",b)?b.set:{},b.trackEcommerce=L("trackEcommerce",b)?b.trackEcommerce:q,b.trackEvent=!!L("trackEvent",b)&&b.trackEvent;var c={};L("fields",b)?c=b.fields:L("cookieConfig",b)?a.isString(b.cookieConfig)?c.cookieDomain=b.cookieConfig:c=b.cookieConfig:a.isString(i)?c.cookieDomain=i:i&&(c=i),b.crossDomainLinker===!0&&(c.allowLinker=!0),L("name",b)&&(c.name=b.name),b.fields=c,W("create",b.tracker,b.fields),v===!0&&W(N("set",b),"checkProtocolTask",null);for(var e in b.set)b.set.hasOwnProperty(e)&&W(N("set",b),e,b.set[e]);b.crossDomainLinker===!0&&(W(N("require",b),"linker"),a.isDefined(b.crossLinkDomains)&&W(N("linker:autoLink",b),b.crossLinkDomains)),b.displayFeatures&&W(N("require",b),"displayfeatures"),b.trackEcommerce&&(r?(W(N("require",b),"ec"),W(N("set",b),"&cu",l)):W(N("require",b),"ecommerce")),b.enhancedLinkAttribution&&W(N("require",b),"linkid"),C&&!t&&W(N("send",b),"pageview",B+P())}):(c.length>1&&(K._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),c=c.slice(0,1)),U("_setAccount",c[0].tracker),e&&U("_setDomainName",e),s&&U("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),C&&!t&&(g?U("_trackPageview",P()):U("_trackPageview"))),!0)},this._ecommerceEnabled=function(a,b){var c=q&&!r;return a===!0&&c===!1&&(q&&r?K._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):K._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=q&&r;return a===!0&&c===!1&&K._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(c,d,e){c=c?c:P(),d=d?d:E[0].title,T(function(){U("_set","title",d),U("_trackPageview",B+c)}),V(function(){var f={page:B+c,title:d};a.extend(f,Q()),a.isObject(e)&&a.extend(f,e),X(b,"send","pageview",f)})},this._trackEvent=function(b,c,d,e,f,g){T(function(){U("_trackEvent",b,c,d,e,!!f)}),V(function(){var h={},i=function(a){return M("trackEvent",a,!0)};a.isDefined(f)&&(h.nonInteraction=!!f),a.isObject(g)&&a.extend(h,g),a.isDefined(h.page)||(h.page=P()),X(i,"send","event",b,c,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){T(function(){U("_addTrans",a,b,c,d,e,f,g,h)}),V(function(){if(K._ecommerceEnabled(!0,"addTrans")){var f=function(a){return M("trackEcommerce",a,!0)};X(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){T(function(){U("_addItem",a,b,c,d,e,f)}),V(function(){if(K._ecommerceEnabled(!0,"addItem")){var g=function(a){return M("trackEcommerce",a,!0)};X(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){T(function(){U("_trackTrans")}),V(function(){if(K._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return M("trackEcommerce",a,!0)};X(a,"ecommerce:send")}})},this._clearTrans=function(){V(function(){if(K._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return M("trackEcommerce",a,!0)};X(a,"ecommerce:clear")}})},this._addProduct=function(b,c,d,e,f,g,h,i,j,k){T(function(){U("_addProduct",b,c,d,e,f,g,h,i,j)}),V(function(){if(K._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return M("trackEcommerce",a,!0)},m={id:b,name:c,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};a.isObject(k)&&a.extend(m,k),X(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){T(function(){U("_addImpression",a,b,c,d,e,f,g,h)}),V(function(){if(K._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return M("trackEcommerce",a,!0)};X(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){T(function(){U("_addPromo",a,b,c,d)}),V(function(){if(K._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return M("trackEcommerce",a,!0)};X(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){T(function(){U("_setAction",a,b)}),V(function(){if(K._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return M("trackEcommerce",a,!0)};X(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",R(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",R(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",R(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a,b){["add","remove"].indexOf(a)!==-1&&(this._setAction(a,{list:b}),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",R(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){V(function(){W(N("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),V(function(){W.apply(K,a)})},this._set=function(a,b,c){V(function(){W(N("set",c),a,b)})},this._trackTimings=function(a,c,d,e){V(function(){X(b,"send","timing",a,c,d,e)})},this._trackException=function(a,c){V(function(){X(b,"send","exception",{exDescription:a,exFatal:!!c})})},n||(this._registerScriptTags(),this._registerTrackers()),C&&H.$on(x,function(){(!y||O.current&&O.current.templateUrl&&!O.current.doNotTrack)&&K._trackPage()}),{log:K.log,offlineQueue:K.offlineQueue,configuration:{accounts:c,universalAnalytics:h,crossDomainLinker:k,crossLinkDomains:d,currency:l,debugMode:m,delayScriptTag:n,disableAnalytics:p,displayFeatures:o,domainName:e,ecommerce:K._ecommerceEnabled(),enhancedEcommerce:K._enhancedEcommerceEnabled(),enhancedLinkAttribution:s,experimentId:f,hybridMobileSupport:v,ignoreFirstPageLoad:t,logAllCalls:u,pageEvent:x,readFromRoute:y,removeRegExp:g,testMode:z,traceDebuggingMode:A,trackPrefix:B,trackRoutes:C,trackUrlParams:D},getUrl:P,setCookieConfig:function(a){return K._log("warn","DEPRECATION WARNING: setCookieConfig method is deprecated. Please use tracker fields instead."),K._setCookieConfig.apply(K,arguments)},getCookieConfig:function(){return K._log("warn","DEPRECATION WARNING: getCookieConfig method is deprecated. Please use tracker fields instead."),i},createAnalyticsScriptTag:function(a){return K._log("warn","DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead."),a&&(i=a),K._createAnalyticsScriptTag()},createScriptTag:function(){return K._log("warn","DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead."),K._createScriptTag()},registerScriptTags:function(){return K._registerScriptTags()},registerTrackers:function(){return K._registerTrackers()},offline:function(a){if(a===!0&&w===!1&&(w=!0),a===!1&&w===!0)for(w=!1;K.offlineQueue.length>0;){var b=K.offlineQueue.shift();b[0].apply(K,b[1])}return w},trackPage:function(a,b,c){K._trackPage.apply(K,arguments)},trackEvent:function(a,b,c,d,e,f){K._trackEvent.apply(K,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){K._addTrans.apply(K,arguments)},addItem:function(a,b,c,d,e,f){K._addItem.apply(K,arguments)},trackTrans:function(){K._trackTrans.apply(K,arguments)},clearTrans:function(){K._clearTrans.apply(K,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){K._addProduct.apply(K,arguments)},addPromo:function(a,b,c,d){K._addPromo.apply(K,arguments)},addImpression:function(a,b,c,d,e,f,g,h){K._addImpression.apply(K,arguments)},productClick:function(a){K._productClick.apply(K,arguments)},promoClick:function(a){K._promoClick.apply(K,arguments)},trackDetail:function(){K._trackDetail.apply(K,arguments)},trackCart:function(a,b){K._trackCart.apply(K,arguments)},trackCheckout:function(a,b){K._trackCheckOut.apply(K,arguments)},trackTimings:function(a,b,c,d){K._trackTimings.apply(K,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){K._trackTransaction.apply(K,arguments)},trackException:function(a,b){K._trackException.apply(K,arguments)},setAction:function(a,b){K._setAction.apply(K,arguments)},pageView:function(){K._pageView.apply(K,arguments)},send:function(a){K._send.apply(K,arguments)},set:function(a,b,c){K._set.apply(K,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){e.gaTrackEventIf&&!c.$eval(e.gaTrackEventIf)||f.length>1&&a.trackEvent.apply(a,f(c))})}}}]),a.module("angular-google-analytics")});
/* globals define */
(function (root, factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
if (typeof module !== 'undefined' && module.exports) {
if (typeof angular === 'undefined') {
factory(require('angular'));
} else {
factory(angular);
}
module.exports = 'angular-google-analytics';
} else if (typeof define === 'function' && define.amd) {
define(['angular'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('angular'));
} else {

@@ -198,6 +203,6 @@ factory(root.angular);

*/
this.$get = ['$document', // To read title
'$location', //
this.$get = ['$document', // To read page title
'$location', //
'$log', //
'$rootScope',//
'$rootScope',//
'$window', //

@@ -301,2 +306,18 @@ '$injector', // To access ngRoute module without declaring a fixed dependency

var _getProtocol = function (httpPostfix, httpsPostfix) {
var protocol = '',
isSslEnabled = document.location.protocol === 'https:',
isChromeExtension = document.location.protocol === 'chrome-extension:',
isHybridApplication = analyticsJS === true && hybridMobileSupport === true;
httpPostfix = angular.isString(httpPostfix) ? httpPostfix : '';
httpsPostfix = angular.isString(httpsPostfix) ? httpsPostfix : '';
if (httpPostfix !== '') {
protocol = 'http:' + httpPostfix;
}
if (isChromeExtension || isHybridApplication || (isSslEnabled && httpsPostfix !== '')) {
protocol = 'https:' + httpsPostfix;
}
return protocol;
};
var _gaJs = function (fn) {

@@ -398,14 +419,21 @@ if (!analyticsJS && $window._gaq && typeof fn === 'function') {

/* DEPRECATED */
this._createScriptTag = function () {
if (!accounts || accounts.length < 1) {
that._log('warn', 'No account id set to create script tag');
return;
}
if (accounts.length > 1) {
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only');
accounts = accounts.slice(0, 1);
}
that._registerScriptTags();
that._registerTrackers();
};
/* DEPRECATED */
this._createAnalyticsScriptTag = function () {
that._registerScriptTags();
that._registerTrackers();
};
this._registerScriptTags = function () {
var document = $document[0],
protocol = _getProtocol(),
scriptSource;
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
that._log('warn', 'Script tags already created');
return;

@@ -415,39 +443,58 @@ }

if (disableAnalytics === true) {
that._log('info', 'Analytics disabled: ' + accounts[0].tracker);
$window['ga-disable-' + accounts[0].tracker] = true;
accounts.forEach(function (trackerObj) {
that._log('info', 'Analytics disabled: ' + trackerObj.tracker);
$window['ga-disable-' + trackerObj.tracker] = true;
});
}
_gaq('_setAccount', accounts[0].tracker);
if(domainName) {
_gaq('_setDomainName', domainName);
}
if (enhancedLinkAttribution) {
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js');
}
if (trackRoutes && !ignoreFirstPageLoad) {
if (removeRegExp) {
_gaq('_trackPageview', getUrl());
//
// Universal Analytics
//
if (analyticsJS === true) {
scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function (){
(i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);
})(window,document,'script',scriptSource,'ga');
} else {
_gaq('_trackPageview');
if (typeof $window.ga !== 'function') {
// In test mode create a ga function if none exists that is a noop sink.
$window.ga = function () {};
}
// Log script injection.
that._log('inject', scriptSource);
}
}
var document = $document[0];
var scriptSource;
if (displayFeatures === true) {
scriptSource = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
if (experimentId) {
var expScript = document.createElement('script'),
s = document.getElementsByTagName('script')[0];
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId;
s.parentNode.insertBefore(expScript, s);
}
//
// Classic Analytics
//
} else {
scriptSource = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
}
scriptSource = _getProtocol('//www', '//ssl') + '.google-analytics.com/ga.js';
if (displayFeatures === true) {
scriptSource = protocol + '//stats.g.doubleclick.net/dc.js';
}
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = scriptSource;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
} else {
// Log the source location for validation
that._log('inject', scriptSource);
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = scriptSource;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
} else {
// Log the source location for validation
that._log('inject', scriptSource);
}
}

@@ -459,127 +506,113 @@

this._createAnalyticsScriptTag = function () {
if (!accounts) {
that._log('warn', 'No account id set to create analytics script tag');
this._registerTrackers = function () {
if (!accounts || accounts.length < 1) {
that._log('warn', 'No accounts to register');
return;
}
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
return;
}
if (disableAnalytics === true) {
//
// Universal Analytics
//
if (analyticsJS === true) {
accounts.forEach(function (trackerObj) {
that._log('info', 'Analytics disabled: ' + trackerObj.tracker);
$window['ga-disable-' + trackerObj.tracker] = true;
});
}
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains;
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures;
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution;
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {};
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce;
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false;
var document = $document[0];
var protocol = hybridMobileSupport === true ? 'https:' : '';
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function (i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function (){
(i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);
})(window,document,'script',scriptSource,'ga');
} else {
if (typeof $window.ga !== 'function') {
// In test mode create a ga function if none exists that is a noop sink.
$window.ga = function () {};
}
// Log script injection.
that._log('inject', scriptSource);
}
// Logic to choose the account fields to be used.
// cookieConfig is being deprecated for a tracker specific property: fields.
var fields = {};
if (isPropertyDefined('fields', trackerObj)) {
fields = trackerObj.fields;
} else if (isPropertyDefined('cookieConfig', trackerObj)) {
if (angular.isString(trackerObj.cookieConfig)) {
fields.cookieDomain = trackerObj.cookieConfig;
} else {
fields = trackerObj.cookieConfig;
}
} else if (angular.isString(cookieConfig)) {
fields.cookieDomain = cookieConfig;
} else if (cookieConfig) {
fields = cookieConfig;
}
if (trackerObj.crossDomainLinker === true) {
fields.allowLinker = true;
}
if (isPropertyDefined('name', trackerObj)) {
fields.name = trackerObj.name;
}
trackerObj.fields = fields;
if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
_ga('create', trackerObj.tracker, trackerObj.fields);
accounts.forEach(function (trackerObj) {
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains;
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures;
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution;
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {};
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce;
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false;
// Hybrid mobile application support
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks
if (hybridMobileSupport === true) {
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null);
}
// Logic to choose the account fields to be used.
// cookieConfig is being deprecated for a tracker specific property: fields.
var fields = {};
if (isPropertyDefined('fields', trackerObj)) {
fields = trackerObj.fields;
} else if (isPropertyDefined('cookieConfig', trackerObj)) {
if (angular.isString(trackerObj.cookieConfig)) {
fields.cookieDomain = trackerObj.cookieConfig;
} else {
fields = trackerObj.cookieConfig;
// Send all custom set commands from the trackerObj.set property
for (var key in trackerObj.set) {
if (trackerObj.set.hasOwnProperty(key)) {
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]);
}
}
} else if (angular.isString(cookieConfig)) {
fields.cookieDomain = cookieConfig;
} else if (cookieConfig) {
fields = cookieConfig;
}
if (trackerObj.crossDomainLinker === true) {
fields.allowLinker = true;
}
if (isPropertyDefined('name', trackerObj)) {
fields.name = trackerObj.name;
}
trackerObj.fields = fields;
_ga('create', trackerObj.tracker, trackerObj.fields);
if (trackerObj.crossDomainLinker === true) {
_ga(generateCommandName('require', trackerObj), 'linker');
if (angular.isDefined(trackerObj.crossLinkDomains)) {
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains);
}
}
// Hybrid mobile application support
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks
if (hybridMobileSupport === true) {
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null);
}
if (trackerObj.displayFeatures) {
_ga(generateCommandName('require', trackerObj), 'displayfeatures');
}
// Send all custom set commands from the trackerObj.set property
for (var key in trackerObj.set) {
if (trackerObj.set.hasOwnProperty(key)) {
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]);
if (trackerObj.trackEcommerce) {
if (!enhancedEcommerce) {
_ga(generateCommandName('require', trackerObj), 'ecommerce');
} else {
_ga(generateCommandName('require', trackerObj), 'ec');
_ga(generateCommandName('set', trackerObj), '&cu', currency);
}
}
}
if (trackerObj.crossDomainLinker === true) {
_ga(generateCommandName('require', trackerObj), 'linker');
if (angular.isDefined(trackerObj.crossLinkDomains)) {
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains);
if (trackerObj.enhancedLinkAttribution) {
_ga(generateCommandName('require', trackerObj), 'linkid');
}
}
if (trackerObj.displayFeatures) {
_ga(generateCommandName('require', trackerObj), 'displayfeatures');
}
if (trackerObj.trackEcommerce) {
if (!enhancedEcommerce) {
_ga(generateCommandName('require', trackerObj), 'ecommerce');
} else {
_ga(generateCommandName('require', trackerObj), 'ec');
_ga(generateCommandName('set', trackerObj), '&cu', currency);
if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
}
});
//
// Classic Analytics
//
} else {
if (accounts.length > 1) {
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only');
accounts = accounts.slice(0, 1);
}
if (trackerObj.enhancedLinkAttribution) {
_ga(generateCommandName('require', trackerObj), 'linkid');
_gaq('_setAccount', accounts[0].tracker);
if(domainName) {
_gaq('_setDomainName', domainName);
}
if (enhancedLinkAttribution) {
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js');
}
if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
if (removeRegExp) {
_gaq('_trackPageview', getUrl());
} else {
_gaq('_trackPageview');
}
}
});
if (experimentId) {
var expScript = document.createElement('script'),
s = document.getElementsByTagName('script')[0];
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId;
s.parentNode.insertBefore(expScript, s);
}
created = true;
return true;

@@ -1082,7 +1115,4 @@ };

if (!delayScriptTag) {
if (analyticsJS) {
this._createAnalyticsScriptTag();
} else {
this._createScriptTag();
}
this._registerScriptTags();
this._registerTrackers();
}

@@ -1138,8 +1168,14 @@

/* DEPRECATED */
setCookieConfig: that._setCookieConfig,
setCookieConfig: function (config) {
that._log('warn', 'DEPRECATION WARNING: setCookieConfig method is deprecated. Please use tracker fields instead.');
return that._setCookieConfig.apply(that, arguments);
},
/* DEPRECATED */
getCookieConfig: function () {
that._log('warn', 'DEPRECATION WARNING: getCookieConfig method is deprecated. Please use tracker fields instead.');
return cookieConfig;
},
/* DEPRECATED */
createAnalyticsScriptTag: function (config) {
that._log('warn', 'DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.');
if (config) {

@@ -1150,5 +1186,13 @@ cookieConfig = config;

},
/* DEPRECATED */
createScriptTag: function () {
that._log('warn', 'DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.');
return that._createScriptTag();
},
registerScriptTags: function () {
return that._registerScriptTags();
},
registerTrackers: function () {
return that._registerTrackers();
},
offline: function (mode) {

@@ -1155,0 +1199,0 @@ if (mode === true && offlineMode === false) {

{
"name": "angular-google-analytics",
"description": "Angular Google Analytics - Easy tracking for your AngularJS application",
"version": "1.1.7",
"version": "1.1.8",
"homepage": "http://github.com/revolunet/angular-google-analytics",

@@ -6,0 +6,0 @@ "author": "Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)",

@@ -5,2 +5,3 @@ # angular-google-analytics

[![NPM Version](https://img.shields.io/npm/v/angular-google-analytics.svg)](https://www.npmjs.com/package/angular-google-analytics)
[![NuGet](https://img.shields.io/nuget/v/angular-google-analytics.svg)](https://www.nuget.org/packages/angular-google-analytics/)
[![Master Build Status](https://codeship.com/projects/ba7a0af0-33fe-0133-927c-127922174191/status?branch=master)](https://codeship.com/projects)

@@ -30,6 +31,19 @@ [![license](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](https://github.com/revolunet/angular-google-analytics/blob/master/LICENSE)

## Installation
## Installation and Quick Start
The quick start is designed to give you a simple, working example for the most common usage scenario. There are numerous other ways to configure and use this library as explained in the documentation.
`bower install angular-google-analytics`
### 1- Installation:
You can install the module from a package manger of your choice directly from the command line
```sh
# Bower
bower install angular-google-analytics
# NPM
npm i angular-google-analytics
# Nuget
nuget install angular-google-analytics
```
Or alternatively, grab the dist/angular-google-analytics.min.js and include it in your project

@@ -44,8 +58,18 @@

In your application, declare dependency injection like so.
### 2- In your application, declare dependency injection:
```javascript
angular.module('myModule', ['angular-google-analytics']);
var myApp = angular.module('myModule', ['angular-google-analytics']);
```
### 3- Set your Google Analytics account and start tracking:
```JavaScript
myApp.config(['AnalyticsProvider', function (AnalyticsProvider) {
// Add configuration code as desired
AnalyticsProvider.setAccount('UU-XXXXXXX-X'); //UU-XXXXXXX-X should be your tracking code
}]).run(['Analytics', function(Analytics) { }]);
```
Congratulations! [angular-google-analytics](https://github.com/revolunet/angular-google-analytics) is ready and Google Analytics will track your page views once the application is run
## Configure Service

@@ -65,3 +89,3 @@ ```js

.startOffline(true)
.useEcommerce(true, true);
.useECommerce(true, true);
```

@@ -204,2 +228,4 @@

### Set Route Tracking Behaviors
**Note:** In order to set route tracking behavior in the $routeProvider you need the ngRoute module in your application. Please refer
to the official [angular ngRoute documentation](https://docs.angularjs.org/api/ngRoute) on how to install and use this service.
```js

@@ -230,7 +256,8 @@ // Track all routes (default is true).

// This is more flexible than using RegExp and easier to maintain for multiple parameters.
// It also reduces tracked pages to routes defined in the $routeProvider and therefor reduces
// bounce rate created by redirects. You can also exclude certain routes from tracking by
// It also reduces tracked pages to routes (only those with a templateUrl) defined in the
// $routeProvider and therefore reduces bounce rate created by redirects.
// NOTE: The following option requires the ngRoute module
AnalyticsProvider.readFromRoute(true);
// Add custom routes to the $routeProvider like this. You can also exclude certain routes from tracking by
// adding 'doNotTrack' property
AnalyticsProvider.readFromRoute(true);
// Add custom routes to the $routeProvider like this
$routeProvider

@@ -244,3 +271,3 @@ .when('/sessions', {

controller: 'MasterController',
pageTrack: '/session'
pageTrack: '/session' // angular-google-analytics extension
})

@@ -250,7 +277,7 @@ .when('/member/:sessionId/:memberId', {

controller: 'CardController',
pageTrack: '/member',
pageTrack: '/member', // angular-google-analytics extension
})
.otherwise({
templateUrl: '404.html',
doNotTrack: true
doNotTrack: true // angular-google-analytics extension
});

@@ -273,5 +300,3 @@ ```

### Support Hybrid Mobile Applications
This property is defined for universal analytics only and is false by default.
### Support Hybrid Mobile Applications (universal analytics only)
```js

@@ -284,9 +309,10 @@ // Set hybrid mobile application support

### Delay Script Tag Insertion
### Delay Script Tag Insertion and Tracker Setup
```js
// Must manually call create script tag method in order to insert and configure Google Analytics:
// Classic analytics: Analytics.createScriptTag();
// Universal analytics: Analytics.createAnalyticsScriptTag();
// Must manually call registerScriptTags method in order to insert the Google Analytics scripts on the page.
// Analytics.registerScriptTags();
// Must manually call registerTrackers method in order to setup the trackers with Google Analytics.
// Analytics.registerTrackers();
// Helpful when needing to do advanced configuration or user opt-out and wanting explicit control
// over when the Google Analytics script gets injected.
// over when the Google Analytics scripts get injected or tracker setup happens.
AnalyticsProvider.delayScriptTag(true);

@@ -389,15 +415,2 @@ ```

### Get or Set Cookie Configuration
**NOTE:** These methods are being **deprecated**. Use the `fields` property on the account object instead.
```js
// Get the global cookie config.
Analytics.getCookieConfig();
// Set the global cookie config.
// Impacts all future calls for classic analytics (ga.js).
Analytics.setCookieConfig();
```
**Note:** Changing the cookie configuration after the AnalyticsProvider configuration does not update the individual account objects used by universal analytics (analytics.js). If you want to change the account objects used by universal analytics those can be accessed through `Analytics.configuration.accounts`, but such modification to the accounts object is unsupported.
### Get URL

@@ -410,10 +423,10 @@ ```js

### Manual Script Tag Injection
If `delayScriptTag(true)` was set during configuration then manual script tag injection is required. Otherwise, the script tag will be automatically injected and configured when the service is instantiated.
### Manual Script Tag Injection and Tracker Setup
If `delayScriptTag(true)` was set during configuration then manual script tag injection and tracker setup is required. Otherwise, the script tag and trackers will be automatically injected and configured when the service is instantiated.
```js
// Manually create classic analytics (ga.js) script tag
Analytics.createScriptTag();
// Manually create either classic analytics (ga.js) or universal analytics (analytics.js) script tags
Analytics.registerScriptTags();
// Manually create universal analytics (analytics.js) script tag
Analytics.createAnalyticsScriptTag();
// Manually setup the tracker object(s)
Analytics.registerTrackers();
```

@@ -664,3 +677,3 @@

## Licence
## License

@@ -667,0 +680,0 @@ As AngularJS itself, this module is released under the permissive [MIT License](http://revolunet.mit-license.org). Your contributions are always welcome.

@@ -24,6 +24,7 @@ /* global afterEach, before, beforeEach, describe, document, expect, inject, it, module, spyOn */

it('should not inject a script tag', function () {
var scriptCount = document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length;
it('should inject a script tag', function () {
inject(function (Analytics) {
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(scriptCount);
expect(Analytics.log.length).toBe(2);
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(document.querySelectorAll('script[src="http://www.google-analytics.com/ga.js"]').length).toBe(0);
});

@@ -36,5 +37,6 @@ });

inject(function (Analytics) {
expect(Analytics.log.length).toBe(1);
expect(Analytics.log[0]).toEqual(['warn', 'No account id set to create script tag']);
expect($log.warn).toHaveBeenCalledWith(['No account id set to create script tag']);
expect(Analytics.log.length).toBe(2);
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(Analytics.log[1]).toEqual(['warn', 'No accounts to register']);
expect($log.warn).toHaveBeenCalledWith(['No accounts to register']);
});

@@ -58,5 +60,5 @@ });

it('should not inject a script tag', function () {
var scriptCount = document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length;
inject(function (Analytics) {
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(scriptCount);
expect(Analytics.log.length).toBe(0);
expect(document.querySelectorAll('script[src="http://www.google-analytics.com/ga.js"]').length).toBe(0);
});

@@ -81,3 +83,4 @@ });

expect(Analytics.log.length).toBe(4);
expect(Analytics.log[0]).toEqual(['warn', 'Multiple trackers are not supported with ga.js. Using first tracker only']);
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(Analytics.log[1]).toEqual(['warn', 'Multiple trackers are not supported with ga.js. Using first tracker only']);
expect($log.warn).toHaveBeenCalledWith(['Multiple trackers are not supported with ga.js. Using first tracker only']);

@@ -89,3 +92,3 @@ });

describe('create script tag', function () {
describe('manually create script tag', function () {
beforeEach(module(function (AnalyticsProvider) {

@@ -97,5 +100,5 @@ AnalyticsProvider.delayScriptTag(true);

inject(function (Analytics) {
Analytics.createScriptTag();
expect(Analytics.log[Analytics.log.length - 1]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);
Analytics.registerScriptTags();
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(document.querySelectorAll('script[src="http://www.google-analytics.com/ga.js"]').length).toBe(0);
});

@@ -108,10 +111,25 @@ });

inject(function (Analytics) {
Analytics.createScriptTag();
expect(Analytics.log[Analytics.log.length - 1]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
Analytics.createScriptTag();
expect($log.warn).toHaveBeenCalledWith(['ga.js or analytics.js script tag already created']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);
Analytics.registerScriptTags();
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
Analytics.registerScriptTags();
expect(Analytics.log[1]).toEqual(['warn', 'Script tags already created']);
expect($log.warn).toHaveBeenCalledWith(['Script tags already created']);
});
});
});
describe('using the deprecated create script call', function () {
it('should warn and inject the script tag', function () {
inject(function ($log) {
spyOn($log, 'warn');
inject(function (Analytics) {
Analytics.createScriptTag();
expect(Analytics.log.length).toBe(4);
expect(Analytics.log[0]).toEqual(['warn', 'DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.']);
expect(Analytics.log[1]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect($log.warn).toHaveBeenCalledWith(['DEPRECATION WARNING: createScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.']);
});
});
});
});
});

@@ -122,4 +140,4 @@

inject(function (Analytics) {
expect(Analytics.log[Analytics.log.length - 1]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);
expect(Analytics.log[0]).toEqual(['inject', 'http://www.google-analytics.com/ga.js']);
expect(document.querySelectorAll('script[src="http://www.google-analytics.com/ga.js"]').length).toBe(0);
});

@@ -204,5 +222,5 @@ });

inject(function (Analytics) {
expect(Analytics.log[Analytics.log.length - 1]).toEqual(['inject', 'http://stats.g.doubleclick.net/dc.js']);
expect(Analytics.log[0]).toEqual(['inject', '//stats.g.doubleclick.net/dc.js']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/ga.js"]').length).toBe(0);
expect(document.querySelectorAll('script[src="http://stats.g.doubleclick.net/dc.js"]').length).toBe(0);
expect(document.querySelectorAll('script[src="//stats.g.doubleclick.net/dc.js"]').length).toBe(0);
});

@@ -209,0 +227,0 @@ });

@@ -48,3 +48,4 @@ /* global afterEach, before, beforeEach, describe, document, expect, inject, it, module, spyOn */

inject(function (Analytics, $window) {
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
Analytics.registerTrackers();
Analytics.offline(false);

@@ -138,3 +139,4 @@ expect(Analytics.log.length).toBe(3);

$window._gaq.length = 0; // clear queue
Analytics.createScriptTag();
Analytics.registerScriptTags();
Analytics.registerTrackers();
Analytics.offline(false);

@@ -141,0 +143,0 @@ expect(Analytics.log.length).toBe(3);

@@ -24,5 +24,6 @@ /* global afterEach, before, beforeEach, describe, document, expect, inject, it, module, spyOn */

it('should not inject a script tag', function () {
it('should inject a script tag', function () {
inject(function (Analytics) {
expect(Analytics.log.length).toBe(1);
expect(Analytics.log.length).toBe(2);
expect(Analytics.log[0]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);

@@ -36,5 +37,6 @@ });

inject(function (Analytics) {
expect(Analytics.log.length).toBe(1);
expect(Analytics.log[0]).toEqual(['warn', 'No account id set to create analytics script tag']);
expect($log.warn).toHaveBeenCalledWith(['No account id set to create analytics script tag']);
expect(Analytics.log.length).toBe(2);
expect(Analytics.log[0]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);
expect(Analytics.log[1]).toEqual(['warn', 'No accounts to register']);
expect($log.warn).toHaveBeenCalledWith(['No accounts to register']);
});

@@ -78,5 +80,4 @@ });

expect(Analytics.log[0]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);
Analytics.createAnalyticsScriptTag();
expect($log.warn).toHaveBeenCalledWith(['ga.js or analytics.js script tag already created']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);
Analytics.registerScriptTags();
expect($log.warn).toHaveBeenCalledWith(['Script tags already created']);
});

@@ -95,3 +96,3 @@ });

Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
expect(Analytics.log[0]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);

@@ -106,7 +107,6 @@ });

Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
expect(Analytics.log[0]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);
Analytics.createAnalyticsScriptTag();
expect($log.warn).toHaveBeenCalledWith(['ga.js or analytics.js script tag already created']);
expect(document.querySelectorAll('script[src="//www.google-analytics.com/analytics.js"]').length).toBe(0);
Analytics.registerScriptTags();
expect($log.warn).toHaveBeenCalledWith(['Script tags already created']);
});

@@ -116,9 +116,2 @@ });

it('should support cookie config with the script call', function () {
inject(function (Analytics) {
Analytics.createAnalyticsScriptTag({ userId: 1234 });
expect(Analytics.getCookieConfig()).toEqual({ userId: 1234 });
});
});
describe('with a prefix set', function(){

@@ -133,3 +126,4 @@ beforeEach(module(function (AnalyticsProvider){

Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
Analytics.registerTrackers();
expect(Analytics.log[2]).toEqual(['send', 'pageview', 'test-prefix']);

@@ -139,2 +133,25 @@ });

});
describe('using the deprecated create script call', function () {
it('should warn and inject the script tag', function () {
inject(function ($log) {
spyOn($log, 'warn');
inject(function (Analytics) {
Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
expect(Analytics.log.length).toBe(4);
expect(Analytics.log[0]).toEqual(['warn', 'DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.']);
expect(Analytics.log[1]).toEqual(['inject', '//www.google-analytics.com/analytics.js']);
expect($log.warn).toHaveBeenCalledWith(['DEPRECATION WARNING: createAnalyticsScriptTag method is deprecated. Please use registerScriptTags and registerTrackers methods instead.']);
});
});
});
it('should support cookie config', function () {
inject(function (Analytics) {
Analytics.createAnalyticsScriptTag({ userId: 1234 });
expect(Analytics.getCookieConfig()).toEqual({ userId: 1234 });
});
});
});
});

@@ -158,3 +175,4 @@

Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
Analytics.registerTrackers();
expect(Analytics.log[0]).toEqual(['inject', 'https://www.google-analytics.com/analytics.js']);

@@ -183,3 +201,4 @@ expect(Analytics.log[1]).toEqual(['create', 'UA-XXXXXX-xx', { cookieDomain: 'auto' }]);

Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
Analytics.registerScriptTags();
Analytics.registerTrackers();
expect(Analytics.log[0]).toEqual(['inject', 'https://www.google-analytics.com/analytics.js']);

@@ -186,0 +205,0 @@ expect(Analytics.log[1]).toEqual(['create', 'UA-XXXXXX-xx', { cookieDomain: 'auto' }]);

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc