// Javascript Error Handler
//
// Upon a javascript error, asks the user for a description of what they were doing when the error occurred,
// after which, the user will not be asked again for the entire session and all Javascript errors will be
// suppressed.
//
// Author: Jonathan K (jonathank(a)(t)chumtv.com)
//
// v0.1 July 5, 2005
// v0.2 July 19, 2005

function JavascriptErrorHandler( )
{
	this.isTesting = false;	
	
	this.promptUser = false;
	
	this.myCookie = this.getCookie("haveShownUserReportPrompt");
	
	this.haveShownUserReportPrompt = ( this.myCookie != null || this.myCookie == "true" );
	

}
JavascriptErrorHandler.GetInstance = function()
{
	if( ! JavascriptErrorHandler.__instance )
	{
		JavascriptErrorHandler.__instance = new JavascriptErrorHandler();
	}
	
	return JavascriptErrorHandler.__instance;
}

JavascriptErrorHandler.Setup = function( pPromptUser )
{
	if( pPromptUser )
	{
		JavascriptErrorHandler.GetInstance().promptUser = pPromptUser;
	}


	var handlerFunction = function( msg, page, line ) 
		{ 
			return JavascriptErrorHandler.LogError( msg, page, line ); 
		};
	
	// If we're on a stage or test site, don't handle errors.
	if( 
		!this.isTesting
		&&
			(
				/^http:\/\/(stage|test)/i.test( document.location ) 
			)
	)
	{
		//return false;
	}
		
	window.onerror = handlerFunction;
	if( window.onerror == handlerFunction )
	{
		// DO NOTHING
	}
	else if( window.addEventListener )
	{
		window.addEventListener( "error", handlerFunction, false );
	}
	else if( window.attachEvent ) 
	{
		window.attachEvent( "onerror", handlerFunction );
	}
}

JavascriptErrorHandler.LogError = function( message, url, line )
{
	var jeh = JavascriptErrorHandler.GetInstance();

	var userReport;
	
	if( jeh.promptUser && !jeh.haveShownUserReportPrompt )
	{
		jeh.haveShownUserReportPrompt = true;
		
		jeh.setCookie( "haveShownUserReportPrompt", "true" );
		
		if( userReport = prompt( "We're sorry, an error occured which may prevent this page from displaying properly.  We have been notified of the problem and will fix it asap.\n\nTo better help us resolve the problem, please describe below what you were doing when you got this error and click OK when you're done.", "Please describe what you were doing when you got this error" ) )
		{
			alert( "Thank you!" );
		}
	}
	
	if( userReport == undefined )
	{
		userReport = "";
	}
	
	var location = url;
	if( location != document.location )
	{
		location = document.location + ": " + location;
	}
	
	if( XMLHttpRequest )
	{
		var req = new XMLHttpRequest();
		
		req.open("POST", "/universalInclude/code/modules/log/logMessage.asp", true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send( 
			"application=javascript"
			+ "&type=error"
			+ "&location=" + escape( location )
			+ "&description=" + escape( "line " + line + ": " + message )
			+ "&userDescription=" + escape( userReport )
			+ "&referrer=" + escape( document.referrer )
			+ "&userAgent=" + escape( navigator.userAgent )
		);
	}
	
	return false;

}

JavascriptErrorHandler.prototype.setCookie = function(name, value, expires, path, domain, secure)
{
	document.cookie= name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
}

JavascriptErrorHandler.prototype.getCookie = function(name)
{
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1)
	{
		begin = dc.indexOf(prefix);
		if (begin != 0) return null;
	}
	else
	{
		begin += 2;
	}
	var end = document.cookie.indexOf(";", begin);
	if (end == -1)
	{
		end = dc.length;
	}
	return unescape(dc.substring(begin + prefix.length, end));
}