﻿//
// requires global AppPath.VirtualPath
// requires /js/prototype.js
// 
var ERR_MSGBOX_ONERROR = true && DEBUG_MODE;
var DEBUG_EMIT_EXTRA_EXCEPTION_INFO = DEBUG_MODE && true;

var MAX_STACKTRACE_DEPTH = 20;
var MAX_ERROR_LENGTH_DISPLAY = 200;

//Event.observe(window, 'error', window_onerror);
//window.onerror = window_onerror;


function writeToConsole(message)
{
    if(DEBUG_MODE && typeof(console) != 'undefined')
    {
        if(console.log)
        {
            console.log(message);
        }
        else if(console.debug)
        {
            console.debug(message);
        }
    }
}

function report_error(message, url, line)
{
	if(arguments.length < 2)
	{
		url = "n/a";
	}
	if(arguments.length < 3)
	{
		line = "n/a";
	}
	window_onerror(message, url, line);
}

function window_onerror(message, url, line)
{
	var s = "An error occured.\r\n";
	try
	{
	    var caller = (window_onerror) ? funcname(window_onerror.caller) : "unknown";
	    
		s += "page   : " + location.href + "\r\n";
		s += "client : " + navigator.appName + " " + navigator.appVersion + "\r\n";
		s += "UA     : " + navigator.userAgent + "\r\n";
		s += "message: " + message + "\r\n";
		s += "url    : " + url + "\r\n";
		s += "line   : " + line + "\r\n";
		s += "caller : " + caller + "\r\n";
//		s += "stack  :\r\n" + stacktrace() + "\r\n";
	}
	catch(e)
	{
		if(ERR_MSGBOX_ONERROR) alert(e.message);
	}
	
	try
	{
		if(ERR_MSGBOX_ONERROR)
		{
			alert("Script error occured: " + message + " (line " + line + ") " + "[" + url + "]");
		}

		SendErrorObjectToServer(s);
    }
    catch(e)
    {
		if(ERR_MSGBOX_ONERROR) alert(e.message);
    }
    
    return true;
}


function SendErrorObjectToServer(str)
{
	try
	{
		new Ajax.Request(AppPath.VirtualPath + "/js/log_js_error.aspx",
			{
				method : 'post',
				postBody : escape(str)
			});
    }
    catch(e)
    {
		if(ERR_MSGBOX_ONERROR) alert(e.message);
    }
}

/*****************************************************************************/
/*
 * Ajax based report updating: error handling
 */
function Ajax_onFailure(sourceFunction, transport)
{
//	if(new RegExp("Session empty").test(transport.responseText))
//	{
//		report_error('report update failure from method ' + sourceFunction + '\nError: ' + transport.responseText 
//			+ '\nResponding with a page reload', location.href);
//		location.reload();
//		return;
//	}
	alert('Er is een fout optreden bij het verversen van de lijst.\n\nDe foutmelding: ' + transport.responseText);
//	report_error('report update failure from method ' + sourceFunction + '\nError: ' + transport.responseText, location.href);
}

function Ajax_onException(sourceFunction, transport, exception)
{
    if(DEBUG_EMIT_EXTRA_EXCEPTION_INFO)
    {
        alert(sourceFunction);
    }
	alert('Er is een fout opgetreden bij het bijwerken van de lijst.\n\nDe foutmelding is: ' + exception.message );
//	report_error('report refresh failure from method ' + sourceFunction + '\nError: ' + exception.message, location.href, exception.fileName + ' ' + exception.lineNumber);
}



/* method copied from internet source */
/* extracts the name of a function from the given string */
function funcname(f)
{
	var s = f.toString().match(/function(\s*)(\w*)/)[2];
	if (s == null || s.length == 0) return "anonymous";
	return s;
}

function numerateArguments(args)
{
	var s = "(";
	for(var i=0; i<args.length; i++)
	{
		s += args[i] + ", ";
	}
	return s + ")";
}

/* method copied from internet source */
/* arguments.caller is not supported by FireFox; FF will return an empty string */
function stacktrace()
{
	try
	{
		for (var a = stacktrace.caller; a != null; a = a.caller)
		{
			if(funcname(a.callee) == "window_onerror") continue;
			s += "->" + funcname(a.callee) + " " + numerateArguments(a.callee.arguments) + "\r\n";
			if (a.caller == a)
			{
				s += "*";
				break;
			}
		}

		return s;

/*
		var s = "";
		
		var a = stacktrace;
		// a.caller may never end
		
		for(var i=0; i < MAX_STACKTRACE_DEPTH && a != null; i++)
		{
			s += funcname(a) + "\n";
			a = a.caller;
			if (a.caller == a)
			{
				s += "*";
				break;
			}
		}
		return s;
*/
	}
	catch(e)
	{
		var msg = (e) ? e.message : e;
		return "stacktrace construction caused error: " + msg;
	}
	
/*
	for (var a = stacktrace.caller; a != null; a = a.caller)
	{
		if(funcname(a.callee) == "window_onerror") continue;
		s += "->" + funcname(a.callee) + " " + numerateArguments(a.callee.arguments) + "\r\n";
		if (a.caller == a)
		{
			s += "*";
			break;
		}
	}

	return s;
	*/
}
