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     });