
function jsError(restore)
{
	var self = this;
	var post_url = '/ajax/jsError';
	var caller = null;
	var isIE = (navigator.userAgent.indexOf('MSIE') > -1) ? true : false;
	var originalErrorHandler;
	var originalDefaultStatus = window.defaultStatus;

	self.parseURL = function(url)
	{ 
		var p = {}, m;  

		if(m = url.match(/((s?ftp|https?):\/\/)?([^\/:]+)?(:([0-9]+))?([^\?#]+)?(\?([^#]+))?(#(.+))?/))
		{  
			p['scheme'] = (m[2]  ? m[2]  : 'http');  
			p['host']   = (m[3]  ? m[3]  : window.location.host);  
			p['port']   = (m[5]  ? m[5]  : null);  
			p['path']   = (m[6]  ? m[6]  : null);  
			p['args']   = (m[8]  ? m[8]  : null);  
			p['anchor'] = (m[10] ? m[10] : null);  

			return p;  
		}  

		return false;  
	}

	self.getCookie = function()
	{
		var cookies = [];
		var exploded;
		var splitted = document.cookie.split('; ');

		for(i = 0; i < splitted.length; i++)
		{
			exploded = splitted[i].split('=');

			cookies[i] = exploded[0] + '=' + exploded[1];
		}

		return cookies.join('&');
	}

	self.restoreState = function()
	{
		if(!isIE)
		{
			window.onerror = originalErrorHandler;
		}

		window.defaultStatus = originalDefaultStatus;
	}

	self.handler = function(msg, url, line)
	{
		var log = {
			/*"date": new Date(),*/
			"line": line,
			"msg": msg,
			"url": url
		}

		var parse_url = self.parseURL(window.location.toString());
		log.scheme = parse_url['scheme'] || '';
		log.port = parse_url['port'] || '';
		log.host = parse_url['host'] || '';
		log.path = parse_url['path'] || '';

		if(parse_url['args'] != null)
		{
			log.path += '?' + parse_url['args'];
		}

		if(parse_url['anchor'] != null)
		{
			log.path += '#' + parse_url['anchor'];
		}

		//log.cookie = self.getCookie(); //URL string becomes too long
		log.browser = navigator.userAgent;
		log.referrer = document.referrer;

		if(isIE)
		{
			caller = window.onerror.caller || window.onerror.arguments.caller;
		}
		else
		{
			// find a way to capture the caller in other browsers
		}

		if(caller != null)
		{
			caller = ('' + caller).replace(/[+]/g, '%2b');
		}

		log.caller = caller || '';

		var params = [];

		for(var i in log)
		{
			params.push(i + "=" + encodeURIComponent(log[i]))
		}

		(new Image()).src = post_url + '?' + params.join('&');
	};

	self.jsError = function()
	{
		if(restore === true)
		{
			window.onunload = self.restoreState;
		}

		window.onerror = self.handler;
	}();
}


var js_error = new jsError(true);
