//
// G. Minami 04/30/2002  Modified to send stats every 30 seconds.  Allows 30-sec approximation of time on page for netscape users.
// G. Minami 05/08/2002  stats sent only 30 seconds for netscape users.
// G. Minami 05/14/2002  modified to separate querystring from url and escape the querystring in case of ampersands
// B.Law     05/21/2002  Made CookieID and SessionID global variables - was causing problem in Netscape.
// B.Law     06/19/2002  Modified so "ivt" cookie is stored with a "/" path so it applies across applications.
// G. Minami 06/24/2002  Made sure all ampersands escaped in querystring in stats xml
// G. Minami 07/09/2002  Added version to xml
// G. Minami 08/02/2002  After 10 minutes stats sent every .05 * time on page seconds
// G. Minami 09/05/2002  detect.vbs now included as detectx.js
// G. Minami 09/25/2002  Subtract eventDuration from eventTime if eventTime==0/null and eventDuration!=null
// G. Minami 10/17/2002  Retry loading stats image if fails
// G. Minami 11/07/2002  Improved algorithm for retry loading stats image
// B.Law     03/05/2003  Made CGI_URL a global that comes from outside the page so the page remains static
// B.Law     03/06/2003  Made BASE_URL a global that comes from outside the page to say where detectx.js should be
// B.Law     04/23/2003  Modified cookie functions to fall back to QueryString logic if cookie fails
// B.Law     04/25/2003  Added checks for NS5up - meaning Netscape version 5 or later
// B.Law     05/06/2003  Added code for detecting WMP9 and getWmpVersion() function
// G.Minami  12/04/2003  Give precedence to querystring login over existing cookie
// G.Minami  12/04/2003  Expire session cookie on unload
// G.Minami  12/08/2003  Added a sixth parameter to LogEvent function.  If this last parameter is set to true, stats
//				will be sent to the server immediately.  This is useful for events which need to
//				be tracked realtime.

var detectVersion = '05.06.03';

var MAX_RETRY_POSTRAW = 10;
var STATS_RETRY_INTERVAL_MS = 3000;

var EventArray = new Array();
var pageopen = new Date();
var js_version
var IS_SOLARIS = false;
var exit_page = false;
var url = "";
var querystring = "";
var CookieID = "";
var SessionID = "";
var statsEnabled = true;
var os_version="";
var user_agent_str = "";
var agt=navigator.userAgent.toLowerCase();

var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3    = (is_ie && (is_major < 4));
var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
var is_ie4up  = (is_ie && (is_major >= 4));
var is_ie5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
var is_ie5_5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);
var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
var is_ie6up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

IS_SOLARIS = (navigator.appVersion.toUpperCase().indexOf("SUNOS") != -1);

var is_ns5up = (navigator.appName == "Netscape"  &&  is_major >= 5);
			
js_version = "0.0";
if (getBrowserType()=="NS" && getBrowserVersion()=="6")
	js_version="1.3";
else if ((navigator.appVersion.indexOf("Mac") != -1) && (getBrowserType()=="IE")) {
	js_version="1.0";

} else {
document.write('<SCRIPT LANGUAGE="JavaScript">');
document.write('js_version = "1.0";');
document.write('</SCRIPT>');
document.write('<SCRIPT LANGUAGE="JavaScript1.1">');
document.write('js_version = "1.1";');
document.write('</SCRIPT>');
document.write('<SCRIPT Language="JavaScript1.2">');
document.write('js_version = "1.2";');
document.write('</SCRIPT>');
document.write('<SCRIPT Language="JavaScript1.3">');
document.write('js_version = "1.3";');
document.write('</SCRIPT>');
document.write('<SCRIPT Language="JavaScript1.4">');
document.write('js_version = "1.4";');
document.write('</SCRIPT>');
document.write('<SCRIPT Language="JavaScript1.5">');
document.write('js_version = "1.5";');
document.write('</SCRIPT>');
}

// WMP9 detection code
var dx_fHasWMP7 = false;
if ((navigator.appVersion.indexOf("Mac") == -1) && (getBrowserType()=="IE")) {
	document.write("<OBJECT classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 codebase='../../#Version=7,0,0,1954' height=1 id=detectWMP7 width=1 VIEWASTEXT></OBJECT>\r\n");
}

if (navigator.appVersion.indexOf("Mac") != -1) {
	WMPControlInstalled = false;
}
if ((navigator.appVersion.indexOf("Mac") != -1) && (getBrowserType()=="IE")) {
	FlashControlInstalled = false;
	WMPControlInstalled = false;
	RealControlInstalled = false;
} else {
	document.write('<SCRIPT LANGUAGE="VBScript" src="' + BASE_URL + 'detectx.js"></script>');
}

var DETECT_isWmpAppletAvailable = false;

/*
if (navigator.appName == "Netscape") {
	document.write(
		"<SCRIPT LANGUAGE='javascript'>\r\n" +
		"var o = java.lang.Class.forName('WMPNS.WMP').newInstance();\r\n" +
		"DETECT_isWmpAppletAvailable = (typeof(o) == 'object');\r\n" +
		"</SCRIPT>\r\n"
	);
}
*/

function getWmpVersion()
{
	if (navigator.appName == "Netscape") {
		if (DETECT_isWmpAppletAvailable) {
			return 9;
		}
		else {
			if (isWindowsMediaEnabled()) return 6;
		}
	}
	else {
		if (dx_fHasWMP7) {
			var a = detectWMP7.versionInfo.split(".");
			return parseInt(a[0]);
		}
		else {
			if (isWindowsMediaEnabled()) return 6;
		}
	}

	// No WMP installed
	return 0;
}


function InitStats() {
	var cookieid = getCookieID();
	if (cookieid=="") writeCookieID();

	var sessionid = getSessionID();
	if (sessionid=="") writeSessionCookieID();

	var qmark = location.href.indexOf("?");
	if (qmark!=-1) {
		url = location.href.substr(0,qmark);
		querystring = location.href.substr(qmark + 1).replace(/&/g,"&amp;");
	} else {
		url = location.href;
	}
	var pound = url.indexOf("#");
	if (pound!=-1)
		url = url.substr(0,pound);

	CookieID = getCookieID();
	SessionID = getSessionID();
	br_type = getBrowserType();	//used for determining page closed NS means pageClosed state may not be valid
	var brv = getBrowserVersion_v2();
	var br = brv.split(":");
	br_type_full = br[0];
	br_version = br[1];
	br_os = getBrowserOS_v2();
	os_version = getOSVersion();
	language = getLanguage_v2();
	bandwidth = 0;
	scr_width = getScreenWidth();
	scr_height = getScreenHeight();
	scr_depth = getScreenDepth();
	referrer = getReferrer();
	is_wmp = isWindowsMediaEnabled();
	is_real = isRealPlayerEnabled();
	is_flash = isFlashEnabled();
	is_cookies = isCookiesEnabled();
	is_java = isJavaEnabled();
	is_vlc = true;
	
	InitStatsTransmission();	

}


function getBrowserType() {
	if (navigator.appName.indexOf("WebTV")!=-1)
	  return "WebTV";
	if (document.all)					//ie
	  return "IE";
	else if (document.layers)			//netscape
	  return "NS";
	else if (document.getElementById)  //netscape 6
	  return "NS";
	else
	  return "UNKNOWN";
}

function getBrowserVersion() {
	if (getBrowserType()=="IE") {		//IE
		if (is_ie3) return 3;
		if (is_ie4) return 4;
		if (is_ie5 || is_ie5_5) return 5;
		if (is_ie6 || is_ie6up) return 6;	
//		var startpos = navigator.appVersion.indexOf("MSIE") + 5;
//		var endpos = navigator.appVersion.indexOf(".",startpos);
//		return navigator.appVersion.substring(startpos,endpos);
	} else if (is_major==5) {		//netscape 6
		return 6;
	} else {							//netscape
		return is_major;
//		var dotpos = navigator.appVersion.indexOf(".");
//		return navigator.appVersion.substr(0,dotpos);
	}
}

function getBrowserOS() { return navigator.platform; }
function getLanguage() { return (navigator.language != null ? navigator.language:""); }
function getURL() { return document.URL; }
function isJavaEnabled() { return navigator.javaEnabled(); }
function getScreenWidth() { return screen.width; }
function getScreenHeight() { return screen.height; }
function getScreenDepth() { return screen.colorDepth; }
function getReferrer() { return document.referrer; }
function isCookiesEnabled() { return (getCookieID()!=""); }

function getBrowserOS_v2()
{
	var os = navigator.platform.toLowerCase();
	if(os=="win32")
		return "Windows";
	if(os.indexOf("macintel")!=-1)
		return "Macintosh (Intel)";
	if(os.indexOf("mac")!=-1)
		return "Macintosh";
	if(os.indexOf("unix")!=-1)
		return "Unix";
	if(os.indexOf("sun")!=-1)
		return "Sun";
	if(os.indexOf("linux")!=-1)
		return "Linux";
	return navigator.platform;
}

function getOSVersion()
{
	try
	{
		var ua = navigator.userAgent.toLowerCase();
		var platform = navigator.platform.toLowerCase();
		if(platform=="win32")
		{
			if(ua.indexOf("windows nt 6.0")!=-1)
				return "Vista";
			if(ua.indexOf("windows nt 5.2")!=-1)
				return "Server 2003";
			if(ua.indexOf("windows nt 5.1")!=-1)
				return "XP";
			if(ua.indexOf("windows nt 5.01")!=-1)
				return "2000 SP1";
			if(ua.indexOf("windows nt 5.0")!=-1)
				return "2000";
			if(ua.indexOf("windows nt 4.0")!=-1)
				return "NT 4.0";
			if(ua.indexOf("windows 98; win 9x 4.90")!=-1)
				return "ME";
			if(ua.indexOf("windows 98")!=-1)
				return "98";
			if(ua.indexOf("windows 95")!=-1)
				return "95";
			if(ua.indexOf("windows ce")!=-1)
				return "CE";
		}
		if(platform.indexOf("mac")!=-1)
		{
			var index = ua.indexOf("ppc mac");
			if(index != -1)
			{
				var index2 = ua.indexOf(";",index);
				var s =  navigator.userAgent.substring(index+8,index2);
				var index3 = s.indexOf("Mach");
				if(index3!=-1)
					s = s.substring(0,index3-1);
				return s;
			}
			index = ua.indexOf("intel mac");
			if(index != -1)
			{
				var index2 = ua.indexOf(";",index);
				var s = navigator.userAgent.substring(index+10,index2);
				var index3 = s.indexOf("Mach");
				if(index3!=-1)
					s = s.substring(0,index3-1);
				return s;
			}
		}
	}
	catch(e)
	{
	}

	user_agent_str = navigator.userAgent;
	return "Unknown";

}

function getBrowserVersion_v2()
{
	try
	{
		var ua = navigator.userAgent.toLowerCase();
		var opera_re  = new RegExp("opera ([0-9]{1,}[\.0-9]{0,})");
		var opera2_re  = new RegExp("opera/([0-9]{1,}[\.0-9]{0,})");
		var ie_re  = new RegExp("msie ([0-9]{1,}[\.0-9]{0,})");
		var firefox_re  = new RegExp("firefox/([0-9]{1,}[\.0-9]{0,})");
		var safari_re  = new RegExp("safari/([0-9]{1,}[\.0-9]{0,})");
		var flock_re  = new RegExp("flock/([0-9]{1,}[\.0-9]{0,})");
		var netscape_re  = new RegExp("netscape/([0-9]{1,}[\.0-9]{0,})");
		var netscape6_re  = new RegExp("netscape6/([0-9]{1,}[\.0-9]{0,})");
		var phoenix_re  = new RegExp("phoenix/([0-9]{1,}[\.0-9]{0,})");
		var firebird_re  = new RegExp("firebird/([0-9]{1,}[\.0-9]{0,})");
		var granparadiso_re  = new RegExp("granparadiso/([0-9]{1,}[\.0-9]{0,})");
		var gecko_re  = new RegExp("gecko/([0-9]{1,}[\.0-9]{0,})");
		if(opera_re.exec(ua) != null)
		{
			return "Opera:"+RegExp.$1;
		}
		else if(opera2_re.exec(ua) != null)
		{
			return "Opera:"+RegExp.$1;
		}
		else if(ie_re.exec(ua) != null)
		{
			rv = parseFloat( RegExp.$1 );
			return "Internet Explorer:"+rv;
		}
		else if(flock_re.exec(ua) != null)
			return "Flock:"+RegExp.$1;
		else if(safari_re.exec(ua) != null)
			return "Safari:"+RegExp.$1;
		else if(netscape_re.exec(ua) != null)
			return "Netscape:"+RegExp.$1;
		else if(netscape6_re.exec(ua) != null)
			return "Netscape:"+RegExp.$1;
		else if(phoenix_re.exec(ua) != null)
			return "Phoenix:"+RegExp.$1;
		else if(firebird_re.exec(ua) != null)
			return "Firebird:"+RegExp.$1;
		else if(granparadiso_re.exec(ua) != null)
			return "GranParadiso:"+RegExp.$1;
		else if(firefox_re.exec(ua) != null)
			return "Firefox:"+RegExp.$1;
		else if(gecko_re.exec(ua) != null)
			return "Mozilla:"+RegExp.$1;
		else
			return "Other:0";
	}
	catch(e)
	{
	}
	user_agent_str = navigator.userAgent;
	return "Other:0";
}

function getLanguage_v2()
{
	return navigator.userLanguage==null?(navigator.language==null?"":navigator.language):navigator.userLanguage;
}

function isFlashEnabled() {
	if (getBrowserType()=="IE") {
		return FlashControlInstalled;
	} else {
		for (i=0;i<navigator.plugins.length;i++) {
			var piname=navigator.plugins[i].name;
			if (piname.indexOf("Shockwave Flash") > -1) return true;
		}
		return false;
	}
}

function isWindowsMediaEnabled() {
	if (getBrowserType()=="IE") {
		return WMPControlInstalled;
	} else {
		for (i=0;i<navigator.plugins.length;i++) {
			var piname=navigator.plugins[i].name;
			if (piname.indexOf("Windows Media") > -1) return true;
		}
		return false;
	}
}

function isRealPlayerEnabled() {
	if (getBrowserType()=="IE") {
		return RealControlInstalled;
	} else {
		for (i=0;i<navigator.plugins.length;i++) {
			var piname=navigator.plugins[i].name;
			if (piname.indexOf("RealPlayer") > -1) return true;
		}
		return false;
	}
}

function getIPAddress() {
	if ((navigator.appVersion.indexOf("4.") != -1) && (navigator.appName.indexOf("Netscape") != -1)){ 
		ip = "" + java.net.InetAddress.getLocalHost().getHostAddress();
		return ip;
	} else return "";
}

function readCookieQS(sCookie)
{
/*
	var s = readCookie(sCookie);
	if (s.length < 1)
		s = getQueryStringValue(sCookie);
*/
	var s = getQueryStringValue(sCookie);
	if (s.length < 1)
		s = readCookie(sCookie);
	return s;
}

function getCookieID()  {  return readCookieQS("ivt"); }
function getSessionID() {  return readCookieQS("ivtsession"); }


function writeCookieID() {
	var cookieid;
	var newid = generateCookieID();
	writeCookie("ivt",newid,"/");
	return newid;
}

function writeSessionCookieID() {
	var cookieid;
	var newid = generateCookieID();
	writeSessionCookie("ivtsession",newid);
	return newid;
}

function generateCookieID() {
	var cookieid;
	var now = new Date();
	cookieid=Math.floor(Math.random()*100000)+""+now.getTime();
	for (var i=0;i<(22-cookieid.length);i++) {
		cookieid="0"+cookieid;
	}
	return cookieid;
}

function readCookie(name) {
	var cookies = document.cookie;
	var start = cookies.indexOf(name+"=");
	if (start == -1) return "";
	
	start = cookies.indexOf("=",start) + 1;
	var end = cookies.indexOf(";",start);
	
	if (end == -1) end = cookies.length;
	
	var value = unescape(cookies.substring(start,end));
	
	if (value == null) value = "";
	return value;
}

function writeCookie(name,value,cookiePath) {
	var expDays = 365; // number of days the cookie should last
	var expDate = new Date();
	expDate.setTime(expDate.getTime() +  (24 * 60 * 60 * 1000 * expDays)); 

	document.cookie = name + "=" + escape(value) + ((cookiePath) ? '; path=' + cookiePath : '') + "; expires=" + expDate.toGMTString() ;
	return value;
}

function deleteCookie(name) {
	document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

function writeSessionCookie(name,value) {
	document.cookie = name+"="+escape(value);
	return value;
}

function deleteSessionCookieID() {
	deleteCookie("ivtsession");
}

function getTimeOnPage() {
	pageclose = new Date();
	
	seconds = Math.round((pageclose-pageopen)/1000);
	return seconds;
}

function FormatSQLDateTime(thetime) {
//
// Formats Javascript date/time into a format compatible with SQL Server datetime format
//
	var year = thetime.getFullYear();
	var month = thetime.getMonth() + 1;
	var date = thetime.getDate();
	var hour = thetime.getHours();
	var min = thetime.getMinutes();
	var sec = thetime.getSeconds();
	
	if (hour<10) hour='0' + hour;
	if (min<10) min='0' + min;
	if (sec<10) sec='0' + sec;
	return month + "/" + date + "/" + year + " " + hour + ":" + min + ":" + sec;
}

function MuseEvent(componentName,componentType,eventName,eventTime,eventDuration) {
	this.componentName = componentName;
	this.componentType = componentType;
	this.eventName = eventName;
	this.eventTime = eventTime;
	this.eventDuration = eventDuration;
	return this;
}

function FinishStats() {
// send events when page closed
	exit_page = true;
	SendStats(true);
	deleteSessionCookieID()
}

function LogEvent(componentName, componentType, eventName, eventTime, eventDuration, trackrealtime) {
//
// Component event handlers should call this function to record an event.  The event
// is stored in a Javascript array and sent using the SendStats function.
//
	if (!statsEnabled) return;

	if (eventTime==0 || eventTime==null) {
		var now = new Date();
		if (eventDuration!=null) 
			eventTime = new Date(now.getTime() - eventDuration*1000);
		else
			eventTime = now;
	}
	if (eventDuration==null) {
		eventDuration = 0;
	}
	EventArray[EventArray.length]=new MuseEvent(componentName, componentType, eventName, eventTime, eventDuration);
	
	//if more than 5 events stored then send stats
	if (EventArray.length>5 || ( (trackrealtime!=null) && (trackrealtime==true) ) ) {
		SendStats(false);
	}
	
	//alert("Event:\n"+"Component Name="+componentName+"\nComponent Type="+componentType+"\nEvent Name="+eventName+"\nEventTime="+eventTime+"\nEvent Duration="+eventDuration);
}

	
var stats_sender;
var stats_currentTransmission = 0;
var stats_includeUserData = true; //must be sent once per page so once its sent in getLogXML set to false
var sendstats_timeout = null;
var transmitstats_timeout = null;
var stats_Queue = new Array(); 
var stats_sender_active = false;
function InitStatsTransmission()
{
	stats_sender = new Image();
	stats_sender.width = 1;
	stats_sender.height = 1;
	stats_sender.onerror = OnStatErr
	stats_sender.onload = OnStatSent;

}	

//
// The SendStats function sends gathered statistics back to the statistics server where it is stored in the database.
// It can be called while the page is active with useDelay=false
// When called with OnUnload, useDelay should be true to allow the asp page to fully execute
//	
function SendStats(useDelay)
{
	if (!statsEnabled) return;

	var index = stats_Queue.length;
	stats_Queue[index] = new Object();
	stats_Queue[index].xml = getLogXML();
	stats_Queue[index].tryCount = 0;
	
	if(useDelay) STATS_RETRY_INTERVAL_MS = 300; //if its the final send allow for 3 retries within the 1 second delay
	
	if(!stats_sender_active)
	{
		TransmitStats();
	}
	
	if (useDelay) {
		for (var y=0;y<10;y++) {
			if (!stats_sender_active) //wont get called must be because of the tight loop and the seperate thread
			{
				break;
			}
			else {
				DoDelay(100);
			}
		}
	}
	else
	{
		if (sendstats_timeout!=null) clearTimeout(sendstats_timeout);
		var m_timeout = (2*60*60*1000); //2 hrs
		var spread = Math.round(10 * 60 * 1000 * Math.random())+10000;
		sendstats_timeout = setTimeout("SendStats(false)",m_timeout-spread);
	}
	
}

function TransmitStats()
{	
	if (transmitstats_timeout!=null) clearTimeout(transmitstats_timeout);

	stats_sender_active = true;		

	var curTransmission = null;
	var tryCount = 0;

	for(var i=0;i< stats_Queue.length;i++)
	{
		if(stats_Queue[i] != null)
		{
			stats_currentTransmission = i;
			curTransmission = stats_Queue[i].xml;
			tryCount = stats_Queue[i].tryCount++;
			break;
		}
	}
	
	if(curTransmission!=null)
	{
		var newurl = CGI_URL+"?xmlstats="+escape(curTransmission) + "&trycount=" + tryCount;
		stats_sender.src = newurl;
	}
	else
		stats_sender_active = false;
}

function OnStatSent()
{
	stats_Queue[stats_currentTransmission] = null;
	transmitstats_timeout = setTimeout("TransmitStats()",1);
	
}

function OnStatErr()
{
	stats_sender_active = false;
	transmitstats_timeout = setTimeout("TransmitStats()",STATS_RETRY_INTERVAL_MS);
}

function DoDelay(msec) {
	var dt = new Date();
	var resumeat = dt.getTime();
	resumeat+=msec;
	while (dt<resumeat) {
		dt = new Date();
	}
}
function getLogXML() 
{
//	user_agent_str = navigator.userAgent;

	var logxml;
	logxml =  '<statistics detectVersion="' + detectVersion + '" pgURL="'+url+'" pgQuerystring="' + querystring + '" pgGUID="' + deploymentGUID + '" vrGUID="' + versionGUID + '" stGUID="'+stGUID+'" start_time="' + FormatSQLDateTime(pageopen) + '" duration="'+getTimeOnPage() + '" exit_page="' + exit_page + '">\r\n';
	logxml += '  <user cookie_id="'+CookieID+'" session_id="'+SessionID+'">\r\n';
	if (stats_includeUserData) {
	stats_includeUserData = false;
	logxml += '    <br_type>'+br_type+'</br_type>\r\n';
	logxml += '    <br_type_full>'+br_type_full+'</br_type_full>\r\n';
	logxml += '    <br_version>'+br_version+'</br_version>\r\n';
	logxml += '    <os>'+br_os+'</os>\r\n';
	logxml += '    <os_version>'+os_version+'</os_version>\r\n';
	logxml += '    <js_version>'+js_version+'</js_version>\r\n';
	logxml += '    <language>'+language+'</language>\r\n';
	logxml += '    <bandwidth>'+bandwidth+'</bandwidth>\r\n';
	logxml += '    <scr_width>'+scr_width+'</scr_width>\r\n';
	logxml += '    <scr_height>'+scr_height+'</scr_height>\r\n';
	logxml += '    <scr_depth>'+scr_depth+'</scr_depth>\r\n';
	logxml += '    <referrer><![CDATA['+referrer+']]></referrer>\r\n';
	logxml += '    <windowsmedia>'+is_wmp+'</windowsmedia>\r\n';
	logxml += '    <realplayer>'+is_real+'</realplayer>\r\n';
	logxml += '    <flash>'+is_flash+'</flash>\r\n';
	logxml += '    <java>'+is_java+'</java>\r\n';
	logxml += '    <cookies>'+is_cookies+'</cookies>\r\n';
	logxml += '    <user_agent>'+user_agent_str+'</user_agent>\r\n';
	}
	logxml += '  </user>\r\n';
	logxml += '  <events>\r\n';
	for (var i=0;i<EventArray.length;i++) {
	logxml += '    <event componentName="'+EventArray[i].componentName+'" componentType="'+EventArray[i].componentType+'" eventName="'+EventArray[i].eventName+'" eventTime="'+FormatSQLDateTime(EventArray[i].eventTime)+'" eventDuration="'+EventArray[i].eventDuration+'"/>\r\n';
	}
	// clear out event array
	EventArray = new Array();
	logxml += '  </events>\r\n';
	logxml += '</statistics>';

	return logxml;

}

