pyc-website
main website for pyc inc.
git clone https://9o.is/git/pyc-website.git
angular-google-analytics.js
(12577B)
1 /* global angular, console */
2
3 'use strict';
4
5 angular.module('angular-google-analytics', [])
6 .provider('Analytics', function() {
7 var created = false,
8 trackRoutes = true,
9 accountId,
10 trackPrefix = '',
11 domainName,
12 analyticsJS = false,
13 pageEvent = '$routeChangeSuccess',
14 cookieConfig = 'auto',
15 ecommerce = false,
16 enhancedLinkAttribution = false,
17 removeRegExp,
18 experimentId,
19 ignoreFirstPageLoad = false;
20
21 this._logs = [];
22
23 // config methods
24 this.setAccount = function(id) {
25 accountId = id;
26 return true;
27 };
28 this.trackPages = function(doTrack) {
29 trackRoutes = doTrack;
30 return true;
31 };
32
33 this.trackPrefix = function(prefix) {
34 trackPrefix = prefix;
35 return true;
36 };
37
38 this.setDomainName = function(domain) {
39 domainName = domain;
40 return true;
41 };
42
43 this.useAnalytics = function(val) {
44 analyticsJS = !!val;
45 return true;
46 };
47
48 this.useEnhancedLinkAttribution = function (val) {
49 enhancedLinkAttribution = !!val;
50 return true;
51 };
52
53 this.setPageEvent = function(name) {
54 pageEvent = name;
55 return true;
56 };
57
58 this.setCookieConfig = function (config) {
59 cookieConfig = config;
60 return true;
61 };
62
63 this.useECommerce = function (val) {
64 ecommerce = !!val;
65 return true;
66 };
67
68 this.setRemoveRegExp = function (regex) {
69 if (regex instanceof RegExp) {
70 removeRegExp = regex;
71 return true;
72 }
73 return false;
74 };
75
76 this.setExperimentId = function (id) {
77 experimentId = id;
78 return true;
79 };
80
81 this.ignoreFirstPageLoad = function (val) {
82 ignoreFirstPageLoad = !!val;
83 };
84
85 // public service
86 this.$get = ['$document', '$rootScope', '$location', '$window', function($document, $rootScope, $location, $window) {
87 var getUrl = function () {
88 var url = $location.path();
89 if (removeRegExp) {
90 return url.replace(removeRegExp, '');
91 }
92 return url;
93 };
94
95 // private methods
96 function _createScriptTag() //noinspection JSValidateTypes
97 {
98 // inject the google analytics tag
99 if (!accountId) return;
100 $window._gaq = [];
101 $window._gaq.push(['_setAccount', accountId]);
102 if (enhancedLinkAttribution) {
103 $window._gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']);
104 }
105 if (trackRoutes && !ignoreFirstPageLoad) {
106 if (removeRegExp) {
107 $window._gaq.push(['_trackPageview', getUrl()]);
108 } else {
109 $window._gaq.push(['_trackPageview']);
110 }
111 }
112 if(domainName) $window._gaq.push(['_setDomainName', domainName]);
113 (function() {
114 var document = $document[0];
115 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
116 ga.src = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
117 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
118 })();
119 created = true;
120 }
121 function _createAnalyticsScriptTag() {
122 if (!accountId) {
123 return console.warn('No account id set for Analytics.js');
124 }
125
126 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
127 (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),
128 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);
129 })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
130
131 $window.ga('create', accountId, cookieConfig);
132
133 if (trackRoutes && !ignoreFirstPageLoad) {
134 $window.ga('send', 'pageview', getUrl());
135 }
136
137 if ($window.ga) {
138 if (ecommerce) {
139 $window.ga('require', 'ecommerce', 'ecommerce.js');
140 }
141 if (enhancedLinkAttribution) {
142 $window.ga('require', 'linkid', 'linkid.js');
143 }
144 if (experimentId) {
145 var expScript = document.createElement('script'),
146 s = document.getElementsByTagName('script')[0];
147 expScript.src = "//www.google-analytics.com/cx/api.js?experiment=" + experimentId;
148 s.parentNode.insertBefore(expScript, s);
149 }
150
151 }
152
153 }
154 this._log = function() {
155 // for testing
156 //console.info('analytics log:', arguments);
157 this._logs.push(arguments);
158 };
159 this._trackPage = function(url, title) {
160 title = title ? title : $document[0].title;
161 if (trackRoutes && !analyticsJS && $window._gaq) {
162 // http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics
163 $window._gaq.push(["_set", "title", title]);
164 $window._gaq.push(['_trackPageview', trackPrefix + url]);
165 this._log('_trackPageview', arguments);
166 } else if (trackRoutes && analyticsJS && $window.ga) {
167 $window.ga('send', 'pageview', {
168 'page': trackPrefix + url,
169 'title': title
170 });
171 this._log('pageview', arguments);
172 }
173 };
174 this._trackEvent = function(category, action, label, value) {
175 if (!analyticsJS && $window._gaq) {
176 $window._gaq.push(['_trackEvent', category, action, label, value]);
177 this._log('trackEvent', arguments);
178 } else if ($window.ga) {
179 $window.ga('send', 'event', category, action, label, value);
180 this._log('event', arguments);
181 }
182
183 };
184
185 /**
186 * Add transaction
187 * https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans
188 * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans
189 * @param transactionId
190 * @param affiliation
191 * @param total
192 * @param tax
193 * @param shipping
194 * @param city
195 * @param state
196 * @param country
197 * @private
198 */
199 this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) {
200 if (!analyticsJS && $window._gaq) {
201 $window._gaq.push(['_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country]);
202 this._log('_addTrans', arguments);
203 } else if ($window.ga) {
204 if (!ecommerce) {
205 console.warn('ecommerce no set. Use AnalyticsProvider.setECommerce(true);');
206 } else {
207 $window.ga('ecommerce:addTransaction', {
208 id: transactionId,
209 affiliation: affiliation,
210 revenue: total,
211 tax: tax,
212 shipping: shipping,
213 currency: currency || 'USD'
214 });
215 this._log('ecommerce:addTransaction', arguments);
216 }
217
218 }
219 };
220
221 /**
222 * Add item to transaction
223 * https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem
224 * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem
225 * @param transactionId
226 * @param sku
227 * @param name
228 * @param category
229 * @param price
230 * @param quantity
231 * @private
232 */
233 this._addItem = function (transactionId, sku, name, category, price, quantity) {
234 if (!analyticsJS && $window._gaq) {
235 $window._gaq.push(['_addItem', transactionId, sku, name, category, price, quantity]);
236 this._log('_addItem', arguments);
237 } else if ($window.ga) {
238 $window.ga('ecommerce:addItem', {
239 id: transactionId,
240 name: name,
241 sku: sku,
242 category: category,
243 price: price,
244 quantity: quantity
245 });
246 this._log('ecommerce:addItem', arguments);
247 }
248 };
249
250 /**
251 * Track transaction
252 * https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans
253 * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData
254 * @private
255 */
256 this._trackTrans = function () {
257 if (!analyticsJS && $window._gaq) {
258 $window._gaq.push(['_trackTrans']);
259 this._log('_trackTrans', arguments);
260 } else if ($window.ga) {
261 $window.ga('ecommerce:send');
262 this._log('ecommerce:send', arguments);
263 }
264
265 };
266
267 /**
268 * Clear transaction
269 * https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData
270 *
271 * @private
272 */
273 this._clearTrans = function () {
274 if ($window.ga) {
275 $window.ga('ecommerce:clear');
276 this._log('ecommerce:clear', arguments);
277 }
278 };
279
280 /**
281 * Send custom events
282 * https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation
283 * https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation
284 *
285 * @param obj
286 * @private
287 */
288 this._send = function (obj) {
289 if ($window.ga) {
290 $window.ga('send', obj);
291 this._log('send', obj);
292 }
293 };
294
295
296
297 // creates the ganalytics tracker
298 if (analyticsJS) {
299 _createAnalyticsScriptTag();
300 } else {
301 _createScriptTag();
302 }
303
304
305 var me = this;
306
307 // activates page tracking
308 if (trackRoutes) $rootScope.$on(pageEvent, function() {
309 me._trackPage(getUrl());
310 });
311
312 return {
313 _logs: me._logs,
314 cookieConfig: cookieConfig,
315 ecommerce: ecommerce,
316 enhancedLinkAttribution: enhancedLinkAttribution,
317 getUrl: getUrl,
318 experimentId: experimentId,
319 ignoreFirstPageLoad: ignoreFirstPageLoad,
320 trackPage: function(url, title) {
321 // add a page event
322 me._trackPage(url, title);
323 },
324 trackEvent: function(category, action, label, value) {
325 // add an action event
326 me._trackEvent(category, action, label, value);
327 },
328 addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) {
329 me._addTrans(transactionId, affiliation, total, tax, shipping, city, state, country, currency);
330 },
331 addItem: function (transactionId, sku, name, category, price, quantity) {
332 me._addItem(transactionId, sku, name, category, price, quantity);
333 },
334 trackTrans: function () {
335 me._trackTrans();
336 },
337 clearTrans: function () {
338 me._clearTrans();
339 },
340 send: function (obj) {
341 me._send(obj);
342 }
343 };
344 }];
345
346 });