;(function($){
    $.ga = function(gaCode, settings){
        var docReady = false;
        var ready = false;
        var pageTrackPreReadyQue = [];
        var trackspondPageTrackPreReadyQue = [];
        var eventTrackPreReadyQue = [];
        
        jQuery(function(){
            docReady = true;
        });
        
        settings = $.extend({selectorMap:{}}, settings);
    
        // Manual tracking function(s)
        $.galog = {
            timezone: null,
            platform: null,
            appId: null,
            tabId: null,
            args: null,
            appState: null,
            
            callToAction : function (label, options) {
                if (!this.appState) { return; } // if this is preview mode, dont display it
                var currentTabId = $.currentTab();
                if (!currentTabId) return;
                
                if (typeof WT != "undefined") {
                    WT.dcsMultiTrack("WT.ria_c", this.appId, "DCSext.platform", this.platform, "DCSext.click", label);
                }
                
                // assemble our data for tracksponder
                var analyticsData = {
                    timezone: this.timezone,
                    platform: this.platform,
                    app_id: this.appId,
                    tab_id: currentTabId,
                    action: 'call',
                    label: label
                }
                
                // make those calls or queue them up
                if (ready) {
                    trackspond(analyticsData);
                } else {
                    trackspondPageTrackPreReadyQue.push(analyticsData);
                }
            },
            
            engagement : function (appType, label, options) {
                if (!this.appState) { return; } // if this is preview mode, dont display it
                var currentTabId = $.currentTab();
                if (!currentTabId) return;
                
                if (typeof WT != "undefined") {
                    WT.dcsMultiTrack("WT.ria_c", this.appId, "DCSext.platform", this.platform, "DCSext.engagement", label);
                }
                
                // assemble our data for tracksponder
                var analyticsData = {
                    timezone: this.timezone,
                    platform: this.platform,
                    app_id: this.appId,
                    tab_id: currentTabId,
                    action: 'engage',
                    label: label
                }
                
                // lets see if they want to fire more events, for example a page view as well
                if (options != null && options.action) {
                    analyticsData.action += ',' + options.action;
                }
                
                // make those calls or queue them up
                if (ready) {
                    trackspond(analyticsData);
                } else {
                    trackspondPageTrackPreReadyQue.push(analyticsData);
                }
            },
            
            share : function (appType, sharedTo, options) {
                if (!this.appState) { return; } // if this is preview mode, dont display it
                var currentTabId = $.currentTab();
                if (!currentTabId) return;
                
                if (typeof WT != "undefined") {
                    WT.dcsMultiTrack("WT.ria_c", this.appId, "DCSext.platform", this.platform, "WT.ria_f", sharedTo);
                }
                
                // assemble our data for tracksponder
                var analyticsData = {
                    timezone: this.timezone,
                    platform: this.platform,
                    app_id: this.appId,
                    tab_id: currentTabId,
                    action: 'share',
                    share: sharedTo
                }
                
                // make those calls or queue them up
                if (ready) {
                    trackspond(analyticsData);
                } else {
                    pageTrackPreReadyQue.push();
                    trackspondPageTrackPreReadyQue.push(analyticsData);
                }
            },
            
            // todo:john - at next deprecation of older templates refactor signature
            pageView : function(appType, gaAction /* dep */, action, args /* as comma delimited */) {
                if (!this.appState) { return; } // if this is preview mode, dont display it
                var currentTabId = $.currentTab();
                if (!currentTabId) return;
                
                // assemble our data for tracksponder
                var analyticsData = {
                    timezone: this.timezone,
                    platform: this.platform,
                    app_id: this.appId,
                    tab_id: currentTabId,
                    action: action
                }
                // if there are more actions, add them, comma delimited
                if (args) {
                    analyticsData.action += ',' + args;
                }
                
                // make those calls or queue them up
                if (ready) {
                    trackspond(analyticsData);
                } else {
                    trackspondPageTrackPreReadyQue.push(analyticsData);
                }
            }
        };
        
        /**
         * Fire our tracksponder
         */
        function trackspond(args) {
            $.servicePost('/transponder/track', args);   
        }
        
        function checkTrackspondPageTrackPreReadyQue(){
            var args;
            while(trackspondPageTrackPreReadyQue.length > 0){
                args = trackspondPageTrackPreReadyQue.pop();
                trackspond(args);
            }
        };
        
        function setupTracking(){
            ready = true;
            checkTrackspondPageTrackPreReadyQue();
        };
        
        // Lets kick this thing off
        try {
            if($.browser.safari) { // Delay for Safari
                var tID = setTimeout(setupTracking, 500);
            } else {
                setupTracking(); 
            }
        } catch(e){
            console.log(e);
            console.log('Couldnt init tracking');
        }
    };
})(jQuery);