/*
 * SharePath Tier0 suite
 * Copyright (c) Correlsense Inc.
 * All rights reserved.
 */

/*
 * Callbacks
 *
 * sp_t0_cb_getWindow()
 * 	If available, returns window instance to monitor.
 *
 * sp_t0_cb_getUser()
 * 	If available, the return value is sent to server as username.
 *
 * sp_t0_cb_getExtraParameters()
 * 	If available, the return value is sent to server as extra information.
 * 	Must be uri encoded.
 */
var _SP_TIER0_COOKIE_TIMEOUT = 3;
var _SP_SUPPORT_OLD_MODE = true;
var _sp_t0_isTier0Enabled = false;
var _sp_t0_prefix = "spt0";
var _sp_t0_cookie = _sp_t0_prefix+"RQTTFB";
var _sp_t0_ttfb = new Date();

function _sp_t0_getXMLHttpRequest() {
	var xmlhttp = null;

	if (window.XMLHttpRequest) {
		xmlhttp = new window.XMLHttpRequest();
	}
	else {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	return xmlhttp;
}

function _sp_t0_saveCookie(name, value) 
{
	window.document.cookie = name+"="+value+"; path=/";
}

function _sp_t0_readCookie(name) 
{
	name += "=";
	var ca = window.document.cookie.split(';');
	for (var i=0;i<ca.length;i++) {
		var c = ca[i].replace(/^[ ]*/, "");
		if (c.indexOf(name) == 0) {
			return c.substring(name.length, c.length);
		}
	}
	return null;
}

function _sp_t0_deleteCookie(name) 
{
	window.document.cookie = name + "=;path=/;expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function _sp_t0_serializeDate(value) 
{
	function lpad(value, len) {
		value=String(value);
		return "0000000000".substring(0, len-value.length)+value;
	}

	if (value == null) {
		return "";
	}
	else {
		return (
			value.getFullYear()+
			lpad(eval(value.getMonth()+1), 2)+
			lpad(value.getDate(), 2)+
			lpad(value.getHours(), 2)+
			lpad(value.getMinutes(), 2)+
			lpad(value.getSeconds(), 2)+
			lpad(value.getMilliseconds(), 3)
		);
	}
}

function _sp_t0_deserializeDate(value) 
{
	return new Date(
		value.substring(0, 4),
		value.substring(4, 6)-1,
		value.substring(6, 8),
		value.substring(8, 10),
		value.substring(10, 12),
		value.substring(12, 14),
		value.substring(14, 17)
	);
}

function _sp_t0_spliturl(url) {
	var ret = new Array();
	var n = url.indexOf("://");
	if (n != -1 && url.substring(0, n).indexOf("/") == -1) {
		ret["protocol"] = url.substring(0, n);
		var rest = url.substring(n+3);
		var n = rest.indexOf("/");
		var host = rest;
		var uri = "";
		if (n != -1) {
			host = rest.substring(0, n);
			uri = rest.substring(n);
		}
		n = host.indexOf("@");
		if (n != -1) {
			host=substring(n+1);
		}
		ret["host"] = host;
		ret["uri"] = uri;
	}
	else {
		ret = _sp_t0_spliturl(window.document.location.href);
		if (url.substring(0, 1) != "/") {
			uri = ret["uri"];
			var n = uri.indexOf("?");
			if (n != -1) {
				uri = uri.substring(0, n);
			}
			n = uri.lastIndexOf("/");
			if (n != -1) {
				uri = uri.substring(0, n);
			}
			ret["uri"] = uri + "/" + url;
		}
		else {
			ret["uri"] = url;
		}
	}

	return ret;
}

function _sp_t0_beginNetwork() {
	_sp_t0_saveCookie(_sp_t0_cookie, _sp_t0_serializeDate(new Date()));
}

function _sp_t0_sendTier0(StatusCode, _RequestTTFB, _ResponseTTFB, _RenderingTime, url, remote_id) {
	var xmlhttp = _sp_t0_getXMLHttpRequest();
	var RequestTTFB = _sp_t0_serializeDate(_RequestTTFB);
	var ResponseTTFB = _sp_t0_serializeDate(_ResponseTTFB);
	var RenderingTime = _sp_t0_serializeDate(_RenderingTime);

	var tier0Url = "Tier0.html?";

	var url_components = _sp_t0_spliturl(url);

	var page = url_components["uri"].replace("?", "&");
	var fixed_url = url_components["protocol"] + "://" + url_components["host"] + url_components["uri"];

	tier0Url += (
		"last_page_time=" + RequestTTFB +
		"&request_return_time=" + ResponseTTFB +
		"&render_time=" + RenderingTime
	);

	if (_SP_SUPPORT_OLD_MODE) {
		if (remote_id == null || remote_id == "") {
			tier0Url +=  "&page=" + page;
		}
		else {
			tier0Url += "&remote_id=" + remote_id;
		}
	}

	try {
		var user=sp_t0_cb_getUser();
		if (user != null) {
			if (_SP_SUPPORT_OLD_MODE) {
				tier0Url += "&user_name=" + escape(user);
			}
			try { xmlhttp.setRequestHeader("X-SharePath-RUM-UserID", user); } catch(e) {}
		}
	}
	catch(e) {}
	try {
		var extra_parameters=sp_t0_cb_getExtraParameters();
		if (extra_parameters != null) {
			if (_SP_SUPPORT_OLD_MODE) {
				tier0Url += "&" + extra_parameters;
			}
			try { xmlhttp.setRequestHeader("X-SharePath-RUM-Parameters", extra_parameters); } catch(e) {}
		}
	}
	catch(e) {}

	try { xmlhttp._sp_t0_skip = true; } catch(e) {}
	xmlhttp.open("GET", tier0Url, false);
	try {
		xmlhttp.setRequestHeader("X-SharePath-RUM-StatusCode", StatusCode);
		xmlhttp.setRequestHeader("X-SharePath-RUM-Referrer", fixed_url);
		xmlhttp.setRequestHeader("X-SharePath-RUM-RequestTTFB", RequestTTFB);
		xmlhttp.setRequestHeader("X-SharePath-RUM-ResponseTTFB", ResponseTTFB);
		xmlhttp.setRequestHeader("X-SharePath-RUM-RenderingTime", RenderingTime);
	} catch(e) {}
	if (remote_id != null && remote_id != "") {
		if (_SP_SUPPORT_OLD_MODE) {
			try { xmlhttp.setRequestHeader("X-SharePathEventID", remote_id); } catch(e) {}
		}
		try { xmlhttp.setRequestHeader("X-SharePath-RUM-RemoteID", remote_id); } catch(e) {}
	}
	xmlhttp.send(null);
}

function _sp_t0_onbeforeunload() 
{
	_sp_t0_beginNetwork();
}

function _sp_t0_onload() 
{
	var render = new Date();

	var RequestTTFB = _sp_t0_readCookie(_sp_t0_cookie);
	_sp_t0_deleteCookie(_sp_t0_cookie);

	if (RequestTTFB == null) {
		RequestTTFB = _sp_t0_ttfb;
	}
	else {
		RequestTTFB = _sp_t0_deserializeDate(RequestTTFB);
	}

	_sp_t0_sendTier0(
		200,
		RequestTTFB,
		_sp_t0_ttfb,
		render,
		window.document.location.href,
		null
	);
}

(function() {
	if (_sp_t0_getXMLHttpRequest() != null) {
		_sp_t0_isTier0Enabled = true;
	}
})();

(function() {
	if (_sp_t0_isTier0Enabled) {
		var _sp_t0_window=window;
		try {
			_sp_t0_window=sp_t0_cb_getWindow();
		}
		catch(e) {}
		if (window.document.all) {
			_sp_t0_window.attachEvent("onload", _sp_t0_onload);
			_sp_t0_window.attachEvent("onbeforeunload", _sp_t0_onbeforeunload);
		}
		else {
			_sp_t0_window.addEventListener("load", _sp_t0_onload, false);
			_sp_t0_window.addEventListener("beforeunload", _sp_t0_onbeforeunload, false);
		}
	}
})();


