﻿/** 
* Version 1.0
* March 27, 2010
*
* Copyright (c) 2010 Wesley Bakker
* Licensed under the GPL licenses.
* http://www.gnu.org/licenses/gpl.txt
* http://weblogs.asp.net/wesleybakker/archive/2010/03/26/google-analytics-and-jquery-happy-together.aspx
**/



// TODO: Figure out the text of the link
// TODO: Figure out the page the link was on
// TODO: Figour out the href

// Google Event Tracking
//$(document).ready(function () {
//    $("a:external").trackEvent(requestInfo);
//});


// Function definitions 

(function ($) {
    var methods = {
        getOptionValue: function (value, elem, event) {
            if ($.isFunction(value)) {
                value = value.call(elem, event);
            }

            return value;
        },
        getCategory: function () {
            return this.nodeName;
        },
        getAction: function (event) {
            return event.type;
        },
        getLabel: function () {
            var self = $(this);
            if (self.is("a")) {
                return self.attr("href");
            }
            else if (self.is("input")) {
                return self.val();
            }
            else if (self.attr("id")) {
                return self.attr("id");
            }
            else {
                return self.text();
            }
        }
    };

    $.expr[':'].external = function (elem) {
        return (elem.host && elem.host !== location.host) === true;
    };

    $.fn.trackEvent = function (options) {
        var settings = {
            eventType: "click",
            once: false,
            category: methods.getCategory,
            action: methods.getAction,
            label: methods.getLabel,
            value: 1
        };

        if (options) $.extend(settings, options);

        this.each(function (i) {
            var eventHandler = function (event) {
                var category = methods.getOptionValue(settings.category, this, event);
                var action = methods.getOptionValue(settings.action, this, event);
                var label = methods.getOptionValue(settings.label, this, event);
                var value = methods.getOptionValue(settings.value, this, event);

                _gaq.push(['_trackEvent', category, action, label, value]);

                // Show an alert when debugging to see what we are tracking
                //if ($("#debugbar").length) {
                //    alert('Trackevent: ' + category + "  |  " + action + "  |  " + label + "  |  " + value);
                //}
            };

            if (settings.once) {
                $(this).one(settings.eventType, eventHandler);
            }
            else {
                $(this).bind(settings.eventType, eventHandler);
            }
        });

        return this;
    };
})(jQuery);

//////////////////////////////////////////////
// Site specific settings
//
// What do you want track
//////////////////////////////////////////////

// Google Event Tracking
$(document).ready(function () {
    $("a:external").trackEvent(); 
});
