﻿(function() {
    //namespace
    window.cmc = window.cmc || {};
    window.cmc.core = window.cmc.core || {};

    var pageTracker = null;
    var virtualPage = null;

    /** 
    * Please update unit tests in line with changes to this js
    */
    var TrackerUtils = (cmc.core.TrackerUtils = {});

    TrackerUtils.setup = function(_pageTracker) {
        pageTracker = _pageTracker;

        //standard tracker setup
        pageTracker._setDomainName("none");
        pageTracker._setAllowLinker(true);
        pageTracker._setAllowHash(false);
        pageTracker._setAllowAnchor(true);
    };

    /**
    * Tracks a page view
    * @param virtualPage 
    */
    TrackerUtils.trackPageview = function(_virtualPage) {
    
        virtualPage = _virtualPage || virtualPage;        

        if (virtualPage) {
            pageTracker._trackPageview(virtualPage);
        }
        else {
            pageTracker._trackPageview();
        }
    };

    TrackerUtils.doTracking = function(_virtualPage) {
        cmc.core.TrackerUtils.trackPageview(_virtualPage);
        cmc.core.TrackerUtils.trackEvents();
        cmc.core.TrackerUtils.trackCrossDomainLinks();
    };

    ///////////////////////////////////////////////////////////////////////////////////////////////
    // Events 
    ///////////////////////////////////////////////////////////////////////////////////////////////

    /**
    * Performs trackEvent() for anchors who's rel attribute contains 'event'. 
    * Use the rev attribute to specify the event category
    * Eg:
    * <a href="http://somewhere.com" rel="event" rev="{eventCategory}>Link</a>
    */
    var trackEvents = (TrackerUtils.trackEvents = function() {

        //rel=action is deprecated - uss rel=event instead
        jQuery("a[rel~=event]").click(function() {
            var jThis = jQuery(this);

            var cat = jThis.attr("rev");
            var href = jThis.attr("href");

            trackEvent(cat, href);
        });

        jQuery("a[href$=pdf]").click(function() {
            var jThis = jQuery(this);
            if (jThis.attr("rev") != "pdf") {
                var cat = "pdf";
                var href = jThis.attr("href");

                trackEvent(cat, href);
            }
        });

        jQuery("a[href^=mailto]").click(function() {
            var jThis = jQuery(this);
            if (jThis.attr("rev") != "mailto") {
                var cat = "mailto";
                var href = jThis.attr("href");

                trackEvent(cat, href);
            }
        });

        jQuery("a[href^=http]").click(function() {
            var jThis = jQuery(this);
            if (jThis.attr("rev") != "outbound") {
                var cat = "outbound";
                var href = jThis.attr("href");

                trackEvent(cat, href);
            }
        });
    });

    /** 
    * Track a single event with google page tracker
    */
    var trackEvent = (TrackerUtils.trackEvent = function(cat, href) {

        var action = null;
        var label = _makeEventLabel(href, cat);
        switch (cat) {
            case "pdf":
            case "doc":
                action = "download";
                break;
            case "video":
                action = "play";
                break;
            case "outbound":
            case "mailto":
                action = "click";
                break;
            default:
                action = cat;
        }

        if (pageTracker && action) {
            try {
                pageTracker._trackEvent(cat, action, label);
            }
            catch (e) {
                //just swallow this one for now                
            }
        }

        return action;
    });

    ///////////////////////////////////////////////////////////////////////////////////////////////
    // Cross Domain Links 
    ///////////////////////////////////////////////////////////////////////////////////////////////

    /**
    * Performs trackCrossDomainLink() for anchors who's rel attribute contains 'xdomain'
    * Eg:
    * <a href="http://somewhere.com" rel="xdomain">Link</a>
    */
    var trackCrossDomainLinks = (TrackerUtils.trackCrossDomainLinks = function() {

        jQuery("a[rel~=xdomain]").click(function() {
            var jThis = jQuery(this);
            var href = jThis.attr("href");
            trackCrossDomainLink(href, jThis.attr("target") == "_blank");
            return false;
        });
    });

    /**
    * Tracks cross domain links using the google analytics _link() function
    */
    var trackCrossDomainLink = (TrackerUtils.trackCrossDomainLink = function(href, newWindow) {
        if (!!newWindow) {
            var url = pageTracker._getLinkerUrl(href);
            window.open(url);
        }
        else {
            pageTracker._link(href);
        }
        return false;
    });

    ///////////////////////////////////////////////////////////////////////////////////////////////
    // Conversions
    ///////////////////////////////////////////////////////////////////////////////////////////////

    /**
    * Performs trackConversion() for anchors who's rel attribute contains 'conversion'
    * Use the rev attribute to specify the conversion id
    * Eg:
    * <a rel="conversion" rev="{conversionId}">Link</a>
    */
    TrackerUtils.trackDynamicConversions = function() {
        jQuery("a[rel~=conversion]").click(function() {
            var conversionId = jQuery(this).attr("rev");
            TrackerUtils.trackConversion(conversionId);
        });
    };

    /**
    * Tracks a conversion. Adds a tracking script to the bottom of the page
    */
    TrackerUtils.trackConversion = function(conversionId) {

        try {
            //code from tracking agency
            var oScript = document.createElement("script");
            var ebRand = Math.random() * 1000000;
            var conversionURL = "http://bs.serving-sys.com/BurstingPipe/ActivityServer.bs?cn=as&ActivityID=" + conversionId + "&f=1&rnd=" + ebRand;
            oScript.src = conversionURL;
            document.body.appendChild(oScript);
        } catch (e) {
            //swallow any errors
        }
    };

    /**
    * Sets the page tracker
    */
    TrackerUtils.setPageTracker = function(_pageTracker) {
        pageTracker = _pageTracker;
    };

    /**
    * Sets a virual page
    * Call this before calling doTracking to track virtual page hits
    */
    TrackerUtils.setVirtualPage = function(_virtualPage) {
        virtualPage = _virtualPage;
    };

    ///////////////////////////////////////////////////////////////////////////////////////////////
    // Private util
    ///////////////////////////////////////////////////////////////////////////////////////////////

    var _makeEventLabel = (TrackerUtils._makeEventLabel = function(href, cat) {
        href = href || "";

        switch (cat) {
            case "pdf":
            case "doc":
                href = href.substring(href.lastIndexOf("/") + 1);
                break;
            case "outbound":
                href = href.substring(href.indexOf("/") + 2);
                if (href.indexOf("/") != -1) href = href.substring(0, href.indexOf("/"));
                if (href.indexOf("?") != -1) href = href.substring(0, href.indexOf("?"));
                break;
            case "mailto":
                href = href.substring(href.lastIndexOf(":") + 1);
                break;
            default:
        }        
        
        var label = href + "_" + window.location.pathname;
        return label;
    });

})();

