﻿//defs
safe = encodeURIComponent;

//Factory class to get TREE Tracker™ 
var _pt = function(){
    return {
        //returns a new tracker instance with user provided config merged in
        _getTracker : function(cfg){
            var t = new _pageTaggingTracker(cfg);
            return t;
        }
    };
    
    //"class" for pageTagging implementation of Tracker
    function _pageTaggingTracker(cfg){
       var version = "0.3";
        
        var internalConfig = {
                visitorNamespace : "tree",
                trackingServer : "tracking.tree.com",
                trackingServerSecure : "stracking.tree.com",
                locationTrackImage: "{0}.gif",
                serverName: "serverName" ,
                pageName : "unset"           
        };
        
        //overrides default config with user provided
        mergeCfg(cfg); 
        
        //constants for querystring field names
        var qsParamConsts = {
            FORCE_TRACK : "Log",
            NAMESPACE : "ns",
            PAGE_NAME : "pageName",
            REFERRER : "referrer",
            TYPE : "type",
            STATUS : "status",
            DNS : "dns",
            URI_STEM : "uristem",
            USER_SUPPLIED_PREFIX: "v_",
            PAGE_LOAD_TIME : "pageload",
            SCREEN : "screen",
            CONNECTION : "ct",
            LANGUAGE : "lng",
            TREE_PT_VERSION : "version",
            URL : "url",
            SERVER_NAME : "sn",
            DATE_TIME : "dt",
            EVENT_CATEGORY : "eventCat",
            EVENT_ACTION : "eventAction",
            EVENT_LABEL : "eventLabel",
            EVENT_VALUE : "eventValue"            
            
        };
        
                
        function validateType(type){
            
        }
        
        //helper class for querystring param
        function qsParam(k,v){
            this.key = k;
            this.value = v;
            this._toString = function(){
                return k+"="+v;
            }
        }
       
        //returns WIDTH x HEIGHT - COLOR_DEPTH
        function getScreenSize(){
            var screenW = 640, screenH = 480;
            if (parseInt(navigator.appVersion)>3) {
             screenW = screen.width;
             screenH = screen.height;
            }
            else if (navigator.appName == "Netscape" 
                && parseInt(navigator.appVersion)==3
                && navigator.javaEnabled()
               ) 
            {
             var jToolkit = java.awt.Toolkit.getDefaultToolkit();
             var jScreenSize = jToolkit.getScreenSize();
             screenW = jScreenSize.width;
             screenH = jScreenSize.height;
            }
            return screenW + "x" + screenH + "-" + window.screen.colorDepth;
       }
       
       //Browser Language
       function getLanguage(){
            return window.navigator.language;
       }

        //returns url for image that will track the event.
        //**Does not track event, simply returns url to call to track it.
       function getEventTrackImgSrc(eC,eA,eL,eV){
            var i = internalConfig;
            var c = qsParamConsts;
            
            var prms = [ 
                        new qsParam(c.FORCE_TRACK, "1") ,
                        new qsParam(c.DATE_TIME,new Date().getTime()) ,
                        new qsParam(c.NAMESPACE , safe(i.visitorNamespace))  ,
                        //new qsParam(c.PAGE_NAME , safe(i.pageName) ),
                        //new qsParam(c.REFERRER , safe(document.referrer) ),
                        new qsParam(c.TYPE , "NPV" ),
                        new qsParam(c.EVENT_CATEGORY , safe(eC)),
                        new qsParam(c.EVENT_ACTION , safe(eA)),
                        new qsParam(c.EVENT_LABEL , safe(eL)),
                        new qsParam(c.EVENT_VALUE , safe(eV)),
                        //new qsParam(c.STATUS, "200" ),
                        //new qsParam(c.DNS, document.location.host ),
                        //new qsParam(c.URI_STEM, safe(location.pathname)  ),
                        //new qsParam(c.SCREEN, getScreenSize() ),
                        //new qsParam(c.CONNECTION, "200" ),
                        //new qsParam(c.LANGUAGE, getLanguage() ),
                        new qsParam(c.TREE_PT_VERSION, version ),
                        new qsParam(c.URL, safe(document.URL)) ,
                        new qsParam(c.SERVER_NAME , safe(i.serverName))                      
                       ];
            var s = "http://" + i.trackingServer + "/" + String.format(i.locationTrackImage,"npv-event") + "?" + joinParams(prms);
            
            return s;
        }
        
        //returns URL for tracking PageView
        //**Does not track pageView, simply returns url suitable for tracking
        function getPageViewTrackImgSrc(){
            var i = internalConfig;
            var c = qsParamConsts;
            
            var prms = [ 
                        new qsParam(c.FORCE_TRACK, "1") ,
                        new qsParam(c.DATE_TIME,new Date().getTime()) ,
                        new qsParam(c.NAMESPACE , safe(i.visitorNamespace))  ,
                        new qsParam(c.PAGE_NAME , safe(i.pageName) ),
                        new qsParam(c.REFERRER , safe(document.referrer) ),
                        new qsParam(c.TYPE , "PV" ),
                        new qsParam(c.STATUS, "200" ),
                        new qsParam(c.DNS, document.location.host ),
                        new qsParam(c.URI_STEM, safe(location.pathname)  ),
                        new qsParam(c.SCREEN, getScreenSize() ),
                        //new qsParam(c.CONNECTION, "200" ),
                        new qsParam(c.LANGUAGE, getLanguage() ),
                        new qsParam(c.TREE_PT_VERSION, version ),
                        new qsParam(c.URL, safe(document.URL)) ,
                        new qsParam(c.SERVER_NAME , safe(i.serverName))                      
                       ];
            var s = "http://" + i.trackingServer + "/" + String.format(i.locationTrackImage, "pv") + "?" + joinParams(prms);
            
            return s;
            
        }
        
        //joins an array of qsParam objects to form a querystring fragment
        function joinParams(prms){
            var a = [];
           
            for(var prm in prms){
                //ensure _toString exists in case array prototype modified
                if(prms[prm]._toString != 'undefined' && typeof prms[prm]._toString == 'function')
                    a.push(prms[prm]._toString());
            }
            return a.join('&');
        }
        
        //helper, img tag suitable for document.write.
        function getImgTag(src){
            return '<im' + 'g sr' + 'c=\"' + src + '\" width=1 height=1 border=0 alt=\"\">'; 
        }
        
        //merges userCfg into internalConfig
        function mergeCfg (userCfg){
            for( var entry in userCfg ){
                internalConfig[entry]=userCfg[entry];
            }
        }
        
        //deprecated :-)
        function init(d){
                    var t = this; //c = _gat, h = c.b, o = c.q, k = c.w, l = c.F, s = c.C, q = c.P, f = c.z, n = "location", w = c.c, x = h, g = new c.hc, z = false; 
                    t.document = document;
                    t.window = window;
                    t.cacheBuster = Math.round((new Date).getTime() / 1000);
                    t.cfg = _pt.mergeCfg(d);
                    t.referrer = t.document.referrer;
        }
        
        //trackPageView private function
        function tPV(){
           //document.write(getImgTag(getPageViewTrackImgSrc()));
           var img = new Image();
           img.src = getPageViewTrackImgSrc();
        }
        
        //trackEvent private function
        function tEvent(category, action, optional_label, optional_value){
            var img = new Image();
            img.src = getEventTrackImgSrc(category, action, optional_label,optional_value);
        }
        
        //public interface
        return {           
            _version : version,
           // _getDocWriteString : getDocWriteStr(),
            _trackPageView : tPV,
            _trackEvent : tEvent
            
        };
                
    }

}();

String.format = function( text )
{
    //check if there are two arguments in the arguments list
    if ( arguments.length <= 1 )
    {
        //if there are not 2 or more arguments there’s nothing to replace
        //just return the original text
        return text;
    }
    //decrement to move to the second argument in the array
    var tokenCount = arguments.length - 2;
    for( var token = 0; token <= tokenCount; token++ )
    {
        //iterate through the tokens and replace their placeholders from the original text in order
        text = text.replace( new RegExp( "\\{" + token + "\\}", "gi" ),
                                                arguments[ token + 1 ] );
    }
    return text;
};



