﻿/**
 * Google Analytics dynamic link tracking script
 * Copyright Beaconfire Consulting, Inc - 2010
 * 
 */
var bf = window.bf || {
    config: {
        debug: false
    }
    , 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() {
        if(Function.prototype.bind) {
            var bind = Function.prototype.bind;
            return function(ctx, func, args) {
                    args = [ctx].concat(args);
                return bind.apply(func, args);
            }
        } else {
            return function(ctx, func, args) {
                return function() {
                    var newArgs = bf.getArgs(arguments);
                    if(args.length)
                        newArgs = args.concat( newArgs );
                    func.apply(ctx, newArgs);
                }
            }
        }
    })()
    , 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 () {

    function configureGA(_gaq) {
            _gaq.push(['_setDomainName', "none" ]);
            _gaq.push(['_setAllowLinker', true ]);
            _gaq.push(['_setAllowHash', false ]);
    }

    return {
        getGATracker: function() {
            return window._gaq;
        }
        , setGATracker: function(tracker) {
            _gaq = 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(":");
                    _gaq.push(['_trackPageview', '/mailto/' +splitResult[1]])+ ";"+((tmp) ? tmp+";" : "");
                };
                aTag.onclick.linktype = 'mailto';
                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);
                            _gaq.push(['_trackPageview','/downloads/' +splitResult[1]])+ ";"
                                +((tmp) ? tmp+";" : "");
                        };
                        aTag.onclick.linktype = 'downloads';
			            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('//');
                    _gaq.push(['_trackPageview','/external/' +splitResult[1]])+ ";"
                        +((tmp != null) ? tmp+";" : "");
                };
                aTag.onclick.linktype = 'external';
                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 != null && 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) {
                                _gaq.push(['_link',target.href]);
                                return false;
                            }
                            return goLink;
                        };
                        aTag.onclick.linktype = 'crossdomain';
                        return true;
                    }
                    break;
                }
            }
            return false;
        }
        , trackLinks: (function() {
            var all_as = document.getElementsByTagName('A');
            return function(all_domains) {
                var _gaq = bf.ga.getGATracker();
                if(!_gaq) return;

                configureGA(_gaq);

                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)
                }
            };
        })()
		
		, trackTransaction :function (orderId, storeName, totalAmount, taxAmount, shippingAmount, city, state, items){
			var _gaq = bf.ga.getGATracker();
			if(!_gaq) return;

			configureGA(_gaq);
			_gaq.push(['_trackPageview']);
			_gaq.push(['_addTrans', orderId, storeName, totalAmount, taxAmount, shippingAmount, city, state]);
			for(i =0; i < items.length; i++){
				 var item = items[i];
				 _gaq.push(['_addItem', item.orderId, item.productId, item.name, item.category, item.price, item.quantity]);
			}
			_gaq.push(['_trackTrans']);
		}
    }
})();
