﻿// gaTracker: jQuery Google Analytics Integration
// A quicker, automated way to embed Google Analytics.
// (c)2007 Jason Huck/Core Five Creative
//
// Requires jQuery 1.2.x or higher (for cross-domain $.getScript)
//
// Usage:
// 
// Only a tracking code is required:
// $.gaTracker('UA-XXXXX-XX');
// 
// ...but other options can be specified:
// $.gaTracker(
//		'UA-XXXXX-XX',
//		{
//			external:	'/external/',
//			mailto:		'/mailto/',
//			download:	'/downloads/',
//			extensions:	[
//				'pdf','doc','xls','csv','jpg','gif', 'mp3',
//				'swf','txt','ppt','zip','gz','dmg','xml'		
//			]
//		}
//	);
//
// TODO: more testing, delay after $.getScript for Safari


(function($) {
    $.gaTracker = function(code, opts) {
        opts = jQuery.extend({
            external: '/external/',
            mailto: '/mailtos/',
            download: '/downloads/',
            extensions: [
					'pdf', 'doc', 'xls', 'csv', 'jpg', 'gif', 'mp3',
					'swf', 'txt', 'ppt', 'zip', 'gz', 'dmg', 'xml'
			]
        }, opts);

        // Returns the given URL prefixed if it is:
        //		a) a link to an external site
        //		b) a mailto link
        //		c) a downloadable file
        // ...otherwise returns an empty string.
        function decorateLink(u) {
            var trackingURL = '';

            if (u.indexOf('://') == -1 && u.indexOf('mailto:') != 0) {
                // no protocol or mailto - internal link - check extension
                var ext = u.split('.')[u.split('.').length - 1];
                var exts = opts.extensions;

                for (i = 0; i < exts.length; i++) {
                    if (ext == exts[i]) {
                        trackingURL = opts.download + u;
                        break;
                    }
                }
            } else {
                if (u.indexOf('mailto:') == 0) {
                    // mailto link - decorate
                    trackingURL = opts.mailto + u.substring(7);
                } else {
                    // complete URL - check domain
                    var regex = /([^:\/]+)*(?::\/\/)*([^:\/]+)(:[0-9]+)*\/?/i;
                    var linkparts = regex.exec(u);
                    var urlparts = regex.exec(location.href);
                    if (linkparts[2] != urlparts[2]) trackingURL = opts.external + u;
                }
            }

            return trackingURL;
        }

        // add tracking code to the current page
        function addTracking() {
            _uacct = code;
            urchinTracker();

            // examine every link in the page
            $('a').each(function() {
                var u = $(this).attr('href');

                if (typeof (u) != 'undefined') {
                    var newLink = decorateLink(u);

                    // if it needs to be tracked manually,
                    // bind a click event to call GA with
                    // the decorated/prefixed link
                    if (newLink.length) {
                        $(this).click(function() {
                            urchinTracker(newLink);
                        });
                    }
                }
            });
        }

        // include the external GA script in try/catch to play nice
        function initGA() {
            try {
                // determine whether to include the normal or SSL version
                var gaURL = (location.href.indexOf('https') == 0 ? 'https://ssl' : 'http://www');
                gaURL += '.google-analytics.com/urchin.js';

                // include the script
                $.getScript(gaURL, function() {
                    addTracking();
                });
            } catch (err) {
                // log any failure
                console.log('Failed to load Google Analytics:' + err);
            }
        }

        initGA();
    }
})(jQuery);

