/**
 * Google Analytics dynamic link tracking script
 * Copyright Beaconfire Consulting, Inc - 2010
 * 
 * Last Modified: 06/17/2010
 */
var bf = window.bf || {
    trim: function(str) {return str.replace(/^\s*([\S\s]*?)\s*$/, '$1');}
    , getArgs: function(argumentsArr, offset) {
        offset = offset || 0;
        var args = [];
        for(var i=offset; i<argumentsArr.length; i++) {
            args[args.length] = argumentsArr[i];
        }
        return args;
    }
    , getEventTarget: function(ev) {
        ev = ev || window.event;
        var target = ev.target || ev.srcElement;
        if(target.tagName != 'A') {
            while(target.tagName != 'A' && target != document) target = target.parentNode;
            if(ev.target == document) return false;
        }
        return target;
    }
    , bind: function(ctx, func, args) {
        return function() {
            func.apply(ctx, args);
        }
    }
    , addListener: function(target, type, func, ctx) {
        if(typeof func != 'function') throw new Error('addListener requires a handler function: ' + func);
        var args = bf.getArgs(arguments, 4) || undefined;
        if(ctx || args) func = bf.bind(ctx, func, args);

        if(target.addEventListener) {
            target.addEventListener(type, func, false);
        } else if(window.attachEvent) {
            target.attachEvent('on' + type, func);
        }
    }
    , onLoad: function(func, ctx) {
        var args = [window, 'load', func, ctx].concat(bf.getArgs(arguments, 2));
        bf.addListener.apply(null, args);
    }
}
bf.ga = (function () {

    var pageTracker = window.pageTracker || null;

    function configureGA(pageTracker) {
        pageTracker._setDomainName("none");
        pageTracker._setAllowLinker(true);
        pageTracker._setAllowHash(false);
    }

    return {
        getGATracker: function() {
            if(!pageTracker) {
                pageTracker = window.pageTracker;
            }
            return pageTracker;
        }
        , setGATracker: function(tracker) {
            pageTracker = tracker;
        }
        , trackMailtoLink: function(aTag) {
	        if (String(aTag.href).indexOf("mailto:") != -1) {
                var tmp = aTag._onclick;
		        aTag.onclick = function(ev){
                    var target = bf.getEventTarget(ev);
                    var splitResult = String(target.href).split(":");
                    pageTracker._trackPageview('/mailto/' +splitResult[1])+ ";"+((tmp != null) ? tmp+";" : "");
                };
                return true;
	        }
            return false;
        }
        , trackFileLink: (function() {
            //List of file extensions on your site. Add/edit as you require
            var extDoc = [".doc",".xls",".exe",".zip",".pdf"];

            return function(aTag) {
	            // Tracking electronic documents - doc, xls, pdf, exe, zip
                var curDomain = window.location.hostname;
                var href = String(aTag.href);
                var tmp = aTag._onclick;
	            for (var j=0; j<extDoc.length; j++) {
		            if (href.indexOf(curDomain) != -1 && href.indexOf(extDoc[j]) != -1) {
			            aTag.onclick = function(ev){
                            var target = bf.getEventTarget(ev);
                            var splitResult = target.href.split(curDomain);
                            pageTracker._trackPageview('/downloads/' +splitResult[1])+ ";"
                                +((tmp != null) ? tmp+";" : "");
                        }
			            return true;
		            }
	            }
                return false;
            }
        })()
        , trackExternalLink: function(aTag) {
            var curDomain = window.location.hostname;
            var href = bf.trim(String(aTag.href));
            var tmp = aTag._onclick;
		    if ((/^https?:/).test(href)
                && href.indexOf(curDomain) == -1
                && href.indexOf('mailto:') == -1) {

			    aTag.onclick = function(ev){
                    var target = bf.getEventTarget(ev);
                    var splitResult = target.href.split('//');
                    pageTracker._trackPageview('/external/' +splitResult[1])+ ";"
                        +((tmp != null) ? tmp+";" : "");
                }
                return true;
		    }
            return false;
        }
        , trackCrossDomainLink: function(aTag, all_domains) {
            if(!all_domains) throw new Error("BF:trackCrossDomainLinks: List of domains required for tracking");

            var curDomain = window.location.hostname;
            var href = String(aTag.getAttribute('href'));
            for(var k = 0, len = all_domains.length; k<len; k++) {
                var re = all_domains[k];
                var m = href.match(re);
                if(m) {
                    var d = m[1];
                    if(d != curDomain && d.indexOf('google-analytics.com') == -1) {
                        aTag.onclick = function(ev){
                            var target = bf.getEventTarget(ev);
                            var goLink = target._onclick ? target._onclick.apply(target,arguments) : true;
                            if(goLink !== false) {
                                pageTracker._link(target.href);
                                return false;
                            }
                            return goLink;
                        };
                        return true;
                    }
                    break;
                }
            }
            return false;
        }
        , trackLinks: (function() {
            var all_as = document.getElementsByTagName('A');
            return function(all_domains) {
                var pageTracker = bf.ga.getGATracker();
                if(!pageTracker) return;

                configureGA(pageTracker);

                var a = null;
                var i = all_as.length;
                while(i) {
                    i--;
                    a = all_as[i];
                    var href = bf.trim(String(a.href));
                    if(!href || href.indexOf('javascript:') != -1) continue;
                    if(a.onclick) {
                        var oc = String(a.onclick);
                        if(oc.indexOf('urchinTracker') > -1 || oc.indexOf('_trackPageview') > -1){
                            continue;
                        }
                        a._onclick = a.onclick;
                    }
                    (all_domains && bf.ga.trackCrossDomainLink(a, all_domains))
                        || bf.ga.trackExternalLink(a)
                        || bf.ga.trackFileLink(a)
                        || bf.ga.trackMailtoLink(a)
                }
            };
        })()
    }
})();

