1/** 2 * @license Angulartics 3 * (c) 2013 Luis Farzati http://angulartics.github.io/ 4 * License: MIT 5 */ 6!function(a,b){"use strict";function c(){ 7// General buffering handler 8function b(a){return function(){k.waitForVendorCount&&(m[a]||(m[a]=[]),m[a].push(arguments))}} 9// As handlers are installed by plugins, they get pushed into a list and invoked in order. 10function c(b,c,d){return n[b]||(n[b]=[]),n[b].push(c),o[c]=d,function(){if(!this.settings.optOut){var c=Array.prototype.slice.apply(arguments);return this.$inject(["$q",a.bind(this,function(d){return d.all(n[b].map(function(b){var e=o[b]||{};if(e.async){var f=d.defer(),g=a.copy(c);return g.unshift(f.resolve),b.apply(this,g),f.promise}return d.when(b.apply(this,c))},this))})])}}} 11// Will run setTimeout if delay is > 0 12// Runs immediately if no delay to make sure cache/buffer is flushed before anything else. 13// Plugins should take care to register handlers by order of precedence. 14function d(a,b){b?setTimeout(a,b):a()} 15// General function to register plugin handlers. Flushes buffers immediately upon registration according to the specified delay. 16function e(b,e,f){ 17// Do not add a handler if developerMode is true 18if(!j.developerMode){p[b]=c(b,e,f);var g=j[b],h=g?g.bufferFlushDelay:null,i=null!==h?h:j.bufferFlushDelay;a.forEach(m[b],function(a,b){d(function(){e.apply(this,a)},b*i)})}}function f(a){return a.replace(/^./,function(a){return a.toUpperCase()})} 19// Adds to the provider a 'register#{handlerName}' function that manages multiple plugins and buffer flushing. 20function g(a){var d="register"+f(a);q[d]=function(b,c){e(a,b,c)},p[a]=c(a,b(a))}function h(b,c,d){a.forEach(c,d);for(var e in b)i[e]=b[e]}var i=this,j={pageTracking:{autoTrackFirstPage:!0,autoTrackVirtualPages:!0,trackRelativePath:!1,trackRoutes:!0,trackStates:!0,autoBasePath:!1,basePath:"",excludedRoutes:[],queryKeysWhitelisted:[],queryKeysBlacklisted:[],filterUrlSegments:[]},eventTracking:{},bufferFlushDelay:1e3,// Support only one configuration for buffer flush delay to simplify buffering 21trackExceptions:!1,optOut:!1,developerMode:!1},l=["pageTrack","eventTrack","exceptionTrack","transactionTrack","setAlias","setUsername","setUserProperties","setUserPropertiesOnce","setSuperProperties","setSuperPropertiesOnce","incrementProperty","userTimings","clearCookies"],m={},n={},o={},p={settings:j}; 22// Opt in and opt out functions 23p.setOptOut=function(a){this.settings.optOut=a,s()},p.getOptOut=function(){return this.settings.optOut};var q={$get:["$injector",function(a){return r(a)}],api:p,settings:j,virtualPageviews:function(a){this.settings.pageTracking.autoTrackVirtualPages=a},trackStates:function(a){this.settings.pageTracking.trackStates=a},trackRoutes:function(a){this.settings.pageTracking.trackRoutes=a},excludeRoutes:function(a){this.settings.pageTracking.excludedRoutes=a},queryKeysWhitelist:function(a){this.settings.pageTracking.queryKeysWhitelisted=a},queryKeysBlacklist:function(a){this.settings.pageTracking.queryKeysBlacklisted=a},filterUrlSegments:function(a){this.settings.pageTracking.filterUrlSegments=a},firstPageview:function(a){this.settings.pageTracking.autoTrackFirstPage=a},withBase:function(b){this.settings.pageTracking.basePath=b?a.element(document).find("base").attr("href"):""},withAutoBase:function(a){this.settings.pageTracking.autoBasePath=a},trackExceptions:function(a){this.settings.trackExceptions=a},developerMode:function(a){this.settings.developerMode=a}},r=function(b){return a.extend(p,{$inject:b.invoke})},s=function(){h(q,l,g)}; 24// Initial register 25h(q,l,g)}function d(b,c,d,e){function f(a){for(var b=0;b<d.settings.pageTracking.excludedRoutes.length;b++){var c=d.settings.pageTracking.excludedRoutes[b];if(c instanceof RegExp&&c.test(a)||a.indexOf(c)>-1)return!0}return!1}function g(a,b){for(var c=[],d=0;d<a.length;d++)b.indexOf(a[d])===-1&&c.push(a[d]);return c}function h(a,b,c){if(/\?/.test(a)&&b.length>0){for(var d=a.split("?"),e=d[0],f=d[1].split("&"),h=[],i=0;i<b.length;i++)for(var j=b[i],k=0;k<f.length;k++)(j instanceof RegExp&&j.test(f[k])||f[k].indexOf(j)>-1)&&h.push(f[k]);var l="white"==c?h:g(f,h);return l.length>0?e+"?"+l.join("&"):e}return a}function i(a){return h(a,d.settings.pageTracking.queryKeysWhitelisted,"white")}function j(a){return h(a,d.settings.pageTracking.queryKeysBlacklisted,"black")}function k(a){var b=d.settings.pageTracking.filterUrlSegments;if(b.length>0){for(var c=a.split("?"),e=c[0],f=e.split("/"),g=0;g<b.length;g++)for(var h=b[g],i=1;i<f.length;i++)/* First segment will be host/protocol or base path. */ 26(h instanceof RegExp&&h.test(f[i])||f[i].indexOf(h)>-1)&&(f[i]="FILTERED");return f.join("/")}return a}function l(a,b){f(a)||(a=i(a),a=j(a),a=k(a),d.pageTrack(a,b))}if(d.settings.pageTracking.autoTrackFirstPage){/* Only track the 'first page' if there are no routes or states on the page */ 27var m=!0;if(e.has("$route")){var n=e.get("$route");
27if(n)for(var o in n.routes){m=!1;break}else null===n&&(m=!1)}else if(e.has("$state")){var p=e.get("$state");p.get().length>1&&(m=!1)}m&&(d.settings.pageTracking.autoBasePath&&(d.settings.pageTracking.basePath=c.location.pathname),e.invoke(["$location",function(a){if(d.settings.pageTracking.trackRelativePath){var b=d.settings.pageTracking.basePath+a.url();l(b,a)}else l(a.absUrl(),a)}]))}if(d.settings.pageTracking.autoTrackVirtualPages){d.settings.pageTracking.autoBasePath&&(/* Add the full route to the base. */ 28d.settings.pageTracking.basePath=c.location.pathname+"#");var m=!0;if(d.settings.pageTracking.trackRoutes&&e.has("$route")){var n=e.get("$route");if(n)for(var o in n.routes){m=!1;break}else null===n&&(m=!1);b.$on("$routeChangeSuccess",function(a,b){b&&(b.$$route||b).redirectTo||e.invoke(["$location",function(a){var b=d.settings.pageTracking.basePath+a.url();l(b,a)}])})}d.settings.pageTracking.trackStates&&(e.has("$state")&&!e.has("$transitions")&&(m=!1,b.$on("$stateChangeSuccess",function(a,b){e.invoke(["$location",function(a){var b=d.settings.pageTracking.basePath+a.url();l(b,a)}])})),e.has("$state")&&e.has("$transitions")&&(m=!1,e.invoke(["$transitions",function(a){a.onSuccess({},function(a){var b=a.options(); 29// only track for transitions that would have triggered $stateChangeSuccess 30b.notify&&e.invoke(["$location",function(a){var b=d.settings.pageTracking.basePath+a.url();l(b,a)}])})}]))),m&&b.$on("$locationChangeSuccess",function(a,b){b&&(b.$$route||b).redirectTo||e.invoke(["$location",function(a){if(d.settings.pageTracking.trackRelativePath){var b=d.settings.pageTracking.basePath+a.url();l(b,a)}else l(a.absUrl(),a)}])})}d.settings.developerMode&&a.forEach(d,function(a,b){"function"==typeof a&&(d[b]=function(){})})}function e(b){return{restrict:"A",link:function(c,d,e){var f=e.analyticsOn||"click",g={};a.forEach(e.$attr,function(a,b){i(b)&&(g[j(b)]=e[b],e.$observe(b,function(a){g[j(b)]=a}))}),a.element(d[0]).on(f,function(f){var i=e.analyticsEvent||h(d[0]);g.eventType=f.type,e.analyticsIf&&!c.$eval(e.analyticsIf)||( 31// Allow components to pass through an expression that gets merged on to the event properties 32// eg. analytics-properites='myComponentScope.someConfigExpression.$analyticsProperties' 33e.analyticsProperties&&a.extend(g,c.$eval(e.analyticsProperties)),b.eventTrack(i,g))})}}}function f(a){a.decorator("$exceptionHandler",["$delegate","$injector",function(a,b){return function(c,d){var e=a(c,d),f=b.get("$analytics");return f.settings.trackExceptions&&f.exceptionTrack(c,d),e}}])}function g(a){return["a:","button:","button:button","button:submit","input:button","input:submit"].indexOf(a.tagName.toLowerCase()+":"+(a.type||""))>=0}function h(a){return g(a)?a.innerText||a.value:a.id||a.name||a.tagName}function i(a){return"analytics"===a.substr(0,9)&&["On","Event","If","Properties","EventType"].indexOf(a.substr(9))===-1}function j(a){var b=a.slice(9);// slice off the 'analytics' prefix 34// slice off the 'analytics' prefix 35return"undefined"!=typeof b&&null!==b&&b.length>0?b.substring(0,1).toLowerCase()+b.substring(1):b}var k=window.angulartics||(window.angulartics={});k.waitForVendorCount=0,k.waitForVendorApi=function(a,b,c,d,e){e||k.waitForVendorCount++,d||(d=c,c=void 0),!Object.prototype.hasOwnProperty.call(window,a)||void 0!==c&&void 0===window[a][c]?setTimeout(function(){k.waitForVendorApi(a,b,c,d,!0)},b):(k.waitForVendorCount--,d(window[a]))},/** 36 * @ngdoc overview 37 * @name angulartics 38 */ 39a.module("angulartics",[]).provider("$analytics",c).run(["$rootScope","$window","$analytics","$injector",d]).directive("analyticsOn",["$analytics",e]).config(["$provide",f])}(angular);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.