function ClientLogger(config)
{
	var _handlerUrl = config.handlerUrl;
	var _sessionID = config.sessionID;
	var _xmlHttp;
	
	function Log(message, url, line)
	{
		var data = "jsmessage=" + encodeURIComponent(message);
		data += "&jsurl=" + encodeURIComponent(url);
		data += "&jsline=" + encodeURIComponent(line);
		data += "&pageurl=" + encodeURIComponent(location.href);
		data += "&useragent=" + encodeURIComponent(navigator.userAgent);
		data += "&sessionID=" + encodeURIComponent(_sessionID);
		
        		
        if(document.all)
            {
            data += "&CompleteDOM=" + encodeURIComponent(document.body.parentElement.innerHTML);
            }
        else
            {
            data += "&CompleteDOM=" + encodeURIComponent(document.body.innerHTML);
            }
		
		_Callback(_handlerUrl, null, data);
	};
	
	function _AbortCallback()
	{
		if (_xmlHttp && _xmlHttp.readyState != 0)
		{
			_xmlHttp.onreadystatechange = function() {};
			_xmlHttp.abort();
		}
	};
	
	function _Callback(url, changeEvent, formData)
	{
		_AbortCallback();
		var method = (formData) ? "POST" : "GET";
		_xmlHttp = _GetXmlHttp();
		_xmlHttp.onreadystatechange = changeEvent || function() {};
		_xmlHttp.open(method, url, true);
		_xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		_xmlHttp.setRequestHeader("ClientLogger", "true");
		_xmlHttp.send(formData);
	};

	function _GetXmlHttp()
	{
		var a = null;
		try { a = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch (e)
		{
			try { a = new ActiveXObject("Microsoft.XMLHTTP"); }
			catch (oc) {}
		}
		if (!a && typeof XMLHttpRequest != "undefined") { a = new XMLHttpRequest(); }
		
		return a;
	};

	this.Log = Log;

	return this;
};