angular-google-analytics
Advanced tools
Comparing version 1.1.7 to 1.1.8
/** | ||
* 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")}); |
348
index.js
/* 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' }]); |
227079
20
4316
683