//------------------------------------------------------------------------------
//parseUri 1.2.2
//(c) Steven Levithan <stevenlevithan.com>
//MIT License

function parseUri (str) {
    var o   = parseUri.options,
        m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
        uri = {},
        i   = 14;

    while (i--) uri[o.key[i]] = m[i] || "";

    uri[o.q.name] = {};
    uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
        if ($1) uri[o.q.name][$1] = $2;
    });

    return uri;
};

parseUri.options = {
    strictMode: false,
    key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
    q:   {
        name:   "queryKey",
        parser: /(?:^|&)([^&=]*)=?([^&]*)/g
    },
    parser: {
        strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
        loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
    }
};

//------------------------------------------------------------------------------

function AnalyticsManager() {
    //
}

AnalyticsManager.getAjaxRequest = function() {
    var req = false;
    // native XMLHttpRequest
    if (window.XMLHttpRequest && !(window.ActiveXObject)) {
        try {
            req = new XMLHttpRequest();
        } catch(e) {
            req = false;
        }
    // IE/Windows ActiveX
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                req = false;
            }
        }
    }
    return req;
}

AnalyticsManager.readyRequest = function(req) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            //alert(req.responseText);
        } else {
            //alert("fail");
        }
    }
}

function AnalyticsUtils() {
    //
}

AnalyticsUtils.getReferrer = function() {
    var referrer = "";
    try {
        referrer = top.document.referrer;
    } catch (e) {
        // 
    }
    if (referrer === "" && parent) {
        try {
            referrer = parent.document.referrer;
        } catch (e) {
            // 
        }
    }
    if (referrer === "") {
        referrer = document.referrer;
    }
    
    var parsed = parseUri(referrer);
    
    return {"referrer":referrer, 
        "path":parsed["path"], "query":parsed["query"]};
}

AnalyticsUtils.getTimezone = function() {
    
    // http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/
    
    var rightNow = new Date();
    var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);  // jan 1st
    var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0); // june 1st
    var temp = jan1.toGMTString();
    var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
    temp = june1.toGMTString();
    var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
    var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
    
    var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
    var dst;
    if (std_time_offset == daylight_time_offset) {
        dst = "0"; // daylight savings time is NOT observed
    } else {
        // positive is southern, negative is northern hemisphere
        var hemisphere = std_time_offset - daylight_time_offset;
        if (hemisphere >= 0)
            std_time_offset = daylight_time_offset;
        dst = "1"; // daylight savings time is observed
    }
    
    return {"std_time_offset": std_time_offset, 
        "dst": dst}; // dst not used
}

AnalyticsManager.gatherData = function() {
    
    //--------------------------------------------------------------------------
    // gather required fields
    
    var data = "url_orig="+encodeURIComponent(window.location.href);
    data += "&url_path="+encodeURIComponent(window.location.pathname);

    // access_mode
    // auth_user --> td
    // auth_testdrive --> testdrive
    // auth_sso --> sso
    // auth_unknown --> unknown
    var access_mode = "unknown";
    if (AnalyticsManager.td_js_initialized) {
    	// needs to run after window.AuthManager.status is initialized
    	var status = window.AuthManager.status;
    	if (status == "auth_user")
    		access_mode = "td";
    	else if (status == "auth_testdrive")
    		access_mode = "testdrive";
    	else if (status == "auth_sso")
    		access_mode = "sso";
    }
    data += "&access_mode="+encodeURIComponent(access_mode);
    
    //--------------------------------------------------------------------------
    // gather optional fields
    
    var timezone = AnalyticsUtils.getTimezone();
    data += "&time_zone_offset="+encodeURIComponent(timezone["std_time_offset"]);
    
    data += "&url_query="+encodeURIComponent(window.location.search);
    
    var referrer = AnalyticsUtils.getReferrer();
    data += "&referrer_orig="+encodeURIComponent(referrer["referrer"]);
    data += "&referrer_path="+encodeURIComponent(referrer["path"]);
    data += "&referrer_query="+encodeURIComponent(referrer["query"]);

    // affiliate_id    
    // edition_id
    // page_type
    // session_id
    // user_id
    var affiliate_id = "";
    var edition_id = "";
    var page_type = "";
    var session_id = "";
    var user_id = "";
    if (AnalyticsManager.td_js_initialized) {
    	
    	if (window.page_type)
    		page_type = window.page_type;
    	
    	if (window.AuthManager.user) {
    		if (window.AuthManager.user.affiliate_id)
    			affiliate_id = window.AuthManager.user.affiliate_id;
    		if (window.AuthManager.user.edition_id)
    			edition_id = window.AuthManager.user.edition_id;
    		if (window.AuthManager.user.session_id)
    			session_id = window.AuthManager.user.session_id;
    		if (window.AuthManager.user.uid)
    			user_id = window.AuthManager.user.uid;
    	}
    }
    data += "&affiliate_id="+encodeURIComponent(affiliate_id);
    data += "&edition_id="+encodeURIComponent(edition_id);
    data += "&page_type="+encodeURIComponent(page_type);
    data += "&session_id="+encodeURIComponent(session_id);
    data += "&user_id="+encodeURIComponent(user_id);
    
    data += "&extra_data=";
    if (analytics_extra_data) {
    	data += encodeURIComponent(analytics_extra_data);
    }
    
    //--------------------------------------------------------------------------
    // fields gathered by server
    
    // access_date, django auto_now_add
    // ip
    
    // geo_country
    // geo_region
    // geo_city
    // geo_postal
    // geo_longitude
    // geo_latitude
    // geo_dma
    
    //--------------------------------------------------------------------------
    // log
    
    if (AnalyticsManager.td_js_initialized)
    	data += "&td_js_initialized=1";
    else
    	data += "&td_js_initialized=0";
    
    return data;
}

AnalyticsManager.logPageHit = function() {

    var data = AnalyticsManager.gatherData();
    
    var ts = new Date().getTime();
    var url = ANALYTICS_API_BASE_URL + "log_page_hit/" + "?" + data + 
        "&ts=" + ts;
    
    var image = new Image();
    image.onLoad = function(){};
    image.src = url;
}

AnalyticsManager.td_js_tries = 0;
AnalyticsManager.td_js_max_tries = 10;
AnalyticsManager.td_js_initialized = false;
AnalyticsManager.ready = function() {
    
	if (!ANALYTICS_API_BASE_URL) {
		// fail
		return;
	}
	
    // check if dom ready, see jQuery ready
    if (!document.body) {
        return setTimeout(AnalyticsManager.ready, 13);
    }
    
    // td js should be initialized to gather td fields
    if (window.AuthManager) {
    	if (window.AuthManager.initialized) {
    		AnalyticsManager.td_js_initialized = true;
    	} else {
    		if (AnalyticsManager.td_js_tries < AnalyticsManager.td_js_max_tries) {
    			AnalyticsManager.td_js_tries++;
    	        return setTimeout(AnalyticsManager.ready, 100);
    		}
    		// else continue without td fields such as access_mode
    	}
    } else {
    	if (AnalyticsManager.td_js_tries < AnalyticsManager.td_js_max_tries) {
    		AnalyticsManager.td_js_tries++;
            return setTimeout(AnalyticsManager.ready, 100);
    	}
    	// else continue without td fields such as access_mode
    }
    
    AnalyticsManager.logPageHit();
}

AnalyticsManager.ready();

