function const_SEVERITY() {
	this.critical = 0;
	this.error    = 1;
	this.warning  = 2;
}

var SEVERITY = new const_SEVERITY;
;

function pgmError(message, severity) {
	var toReturn = new Error(message);

	if (severity == null) {
		severity = SEVERITY.warning;
	} else if ((typeof severity) == "string") {
		switch (severity.toLower) {
		case "critical" :
			severity = SEVERITY.critical;
			break;
		case "error" :
			severity = SEVERITY.error;
			break;
		case "warning" :
			severity = SEVERITY.warning;
			break;
		}
	}
	
	if ((typeof severity) != "number") {
		severity = SEVERITY.critical;
		message += " [CRITICAL: undefined error level!!]";
	}
	
	toReturn.severity = severity;
	return toReturn;
}

function handleException(exception) {
	if (document.getElementById('jsExceptionBox')) {
		document.getElementById('jsExceptionBox').innerHTML += "<b>JavaScript Exception</b>: ";
		document.getElementById('jsExceptionBox').innerHTML +=      exception.message;
		document.getElementById('jsExceptionBox').innerHTML += "<br/><b>Stack Trace</b>: ";
		document.getElementById('jsExceptionBox').innerHTML +=	arguments.callee.trace().join("<br />\n");
		document.getElementById('jsErrorButton').style.display = "block";
	}
	
	alert('Exception: ' + exception.message);
	
	if (exception.severity == SEVERITY.error) {
	} else if (exception.severity == SEVERITY.critical) {
		alert('A critical error was encountered: ' + exception.message + '\r\n' + 
			  '(A full stack trace is available in error window)');
	}
}


Function.prototype.trace = function()
{
    var trace = [];
    var current = this;
    while(current)
    {
        trace.push(current.signature());
        current = current.caller;
    }
    return trace;
}
Function.prototype.signature = function()
{
    var signature = {
        name: this.getName(),
        params: [],
        toString: function()
        {
            var params = this.params.length > 0 ?
                "'" + this.params.join("', '") + "'" : "";
            return this.name + "(" + params + ")"
        }
    };
    if(this.arguments)
    {
        for(var x=0; x<this .arguments.length; x++)
            signature.params.push(this.arguments[x]);
    }
    return signature;
}
Function.prototype.getName = function()
{
    if(this.name)
        return this.name;
    var definition = this.toString().split("\n")[0];
    var exp = "/^function ([^\s(]+).+/|>";
    if(exp.test(definition))
        return definition.split("\n")[0].replace(exp, "$1") || "anonymous";
    return "anonymous";
}
