/* $Id: jquery.custom_analytics.js 98 2011-03-22 04:59:57Z csnm $ */
(function ($) {
    $.fn.extend({
        extendedTracker: function (options) {
            var opts = $.extend({
                gaExtensions: ["avi", "css", "csv", "doc", "docx", "eps", "jpg", "js", "mov", "mp3", "mpeg", "pdf", "png", "ppt", "pptx", "rar", "rtf", "svg", "txt", "vsd", "vxd", "wma", "wmv", "xls", "xlsx", "zip"],
                gaqVar: "_gaq",
                gaAccounts: [],
                gaPrefixMailto: "/mailto/",
                gaPrefixDownload: "/download/",
                gaPrefixExternal: "/external/"
            }, options);

            var _re = new RegExp("\\.(?:" + opts.gaExtensions.join("|") + ")(?:$|\\?)", "i");
            var _gaAccountsLength = opts.gaAccounts.length;

            return this.each(function () {
                if ($(this).get(0).nodeName.toLowerCase() == "a" && $(this).attr("href") && !$(this).attr("href").match(/^(?:javascript:|#?\s*)$/i)) {
                    var i, 
                        _onClick = [],
                        _href = $(this).attr("href"),
                        _lowerHref = _href.toLowerCase(),
                        _eventState = false,
                        _eventPrefix = '/';

                    if (!$(this).attr("onclick") && false === Boolean($(this).data("events"))) {/* Check for existing events on this node  */
                        if (_lowerHref.match(/^mailto:/)) { /* is Mailto link? */
                            for (i = 0; i < _gaAccountsLength; i++) {
                                _onClick.push(opts.gaqVar + ".push(['" + opts.gaAccounts[i] + "._trackPageview', '" + opts.gaPrefixMailto + _href.substring(7) + "']);");
                                _eventPrefix = opts.gaPrefixMailto;
                            }
                        } 
                        else if (_lowerHref.match(/^http(s)?:\/\//)) { /* Could be an external link. Could also be a local link. Only track external links. */
                            if (_lowerHref.split("?")[0].indexOf(location.hostname.toLowerCase().replace(/www\./, "")) == -1) {/* This is an external link */
                                for (i = 0; i < _gaAccountsLength; i++) {
                                    _onClick.push(opts.gaqVar + ".push(['" + opts.gaAccounts[i] + "._trackPageview', '" + opts.gaPrefixExternal + _href + "']);");
                                    _eventPrefix = opts.gaPrefixExternal;
                                }
                            } else { /* This is an internal link. Check for downloadable file types */
                                if (_href.match(_re)) {
                                    _href = (_href.charAt(0) == "/" ? _href.substring(1) : _href);
                                    for (i = 0; i < _gaAccountsLength; i++) {
                                        _onClick.push(opts.gaqVar + ".push(['" + opts.gaAccounts[i] + "._trackPageview', '" + opts.gaPrefixDownload + _href + "']);");
                                        _eventPrefix = opts.gaPrefixDownload;
                                    }
                                }
                            }
                        }
                        /* Check if this is a downloadable file */
                        else if (_href.match(_re)) { /* Downloadable file */
                            for (i = 0; i < _gaAccountsLength; i++) {
                                _href = (_href.charAt(0) == "/" ? _href.substring(1) : _href);
                                _onClick.push(opts.gaqVar + ".push(['" + opts.gaAccounts[i] + "._trackPageview', '" + opts.gaPrefixDownload + _href + "']);");
                                _eventPrefix = opts.gaPrefixDownload;
                            }
                        }
                        if (_onClick.length > 0 && false === Boolean($(this).data("events"))){
                            $(this).click(function(){
                                for (i = 0; i < _gaAccountsLength; i++) {
                                    _gaq.push([opts.gaAccounts[i] + "._trackPageview", _eventPrefix + _href ]);
                                }
                            });                 
                        }
                    }
                }
            });
        }
    });
})(jQuery);

// Calling it
$("a[href]").extendedTracker({gaAccounts: ["_m1", "_m2"]});
