(function () { angular.module('angularytics', []).provider('Angularytics', function () { var eventHandlersNames = ['Google']; this.setEventHandlers = function (handlers) { if (angular.isString(handlers)) { handlers = [handlers]; } eventHandlersNames = []; angular.forEach(handlers, function (handler) { eventHandlersNames.push(capitalizeHandler(handler)); }); }; var capitalizeHandler = function (handler) { return handler.charAt(0).toUpperCase() + handler.substring(1); }; var pageChangeEvent = '$locationChangeSuccess'; this.setPageChangeEvent = function (newPageChangeEvent) { pageChangeEvent = newPageChangeEvent; }; this.$get = [ '$injector', '$rootScope', '$location', function ($injector, $rootScope, $location) { var eventHandlers = []; angular.forEach(eventHandlersNames, function (handler) { eventHandlers.push($injector.get('Angularytics' + handler + 'Handler')); }); var forEachHandlerDo = function (action) { angular.forEach(eventHandlers, function (handler) { action(handler); }); }; $rootScope.$on(pageChangeEvent, function () { forEachHandlerDo(function (handler) { var url = $location.path(); if (url) { handler.trackPageView(url); } }); }); var service = {}; service.init = function () { }; service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) { forEachHandlerDo(function (handler) { if (category && action) { handler.trackEvent(category, action, opt_label, opt_value, opt_noninteraction); } }); }; return service; } ]; }); }()); (function () { angular.module('angularytics').factory('AngularyticsConsoleHandler', [ '$log', function ($log) { var service = {}; service.trackPageView = function (url) { $log.log('URL visited', url); }; service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) { $log.log('Event tracked', category, action, opt_label, opt_value, opt_noninteraction); }; return service; } ]); }()); (function () { angular.module('angularytics').factory('AngularyticsGoogleHandler', [ '$log', function ($log) { var service = {}; service.trackPageView = function (url) { _gaq.push([ '_set', 'page', url ]); _gaq.push([ '_trackPageview', url ]); }; service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) { _gaq.push([ '_trackEvent', category, action, opt_label, opt_value, opt_noninteraction ]); }; return service; } ]).factory('AngularyticsGoogleUniversalHandler', function () { var service = {}; service.trackPageView = function (url) { window._gaq.push(['_trackPageview', url]); }; service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) { window.ga('send', 'event', category, action, opt_label, opt_value, { 'nonInteraction': opt_noninteraction }); }; return service; }); }()); (function () { angular.module('angularytics').filter('trackEvent', [ 'Angularytics', function (Angularytics) { return function (entry, category, action, opt_label, opt_value, opt_noninteraction) { Angularytics.trackEvent(category, action, opt_label, opt_value, opt_noninteraction); return entry; }; } ]); }());