
// stack trace functions as defined at http://pastie.org/253058
// and http://www.helephant.com/Article.aspx?ID=675.
function stackTrace(startingPoint, error)
{
  var errormsg = "";
  if (error != null)
  {
    errormsg = error.toString()+"<br/>\n";
  }
  var stack = getStack();
  var stackTraceMessage = stack.join("<br/>\n");
  // display message
  logError(errormsg+stackTraceMessage);
}
getStack = (function()
{
  var mode;
  try {(0)()} catch (e) {
      mode = e.stack ? 'Firefox' : window.opera ? 'Opera' : 'Other';
  }
  
  switch (mode) {
      case 'Firefox' : return function () {
          try {(0)()} catch (e) {
              return e.stack.replace(/^.*?\n/,'').
                             replace(/(?:\n@:0)?\s+$/m,'').
                             replace(/^\(/gm,'{anonymous}(').
                             split("\n");
          }
      };
  
      case 'Opera' : return function () {
          try {(0)()} catch (e) {
              var lines = e.message.split("\n"),
                  ANON = '{anonymous}',
                  lineRE = /Line\s+(\d+).*?in\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,
                  i,j,len;
  
              for (i=4,j=0,len=lines.length; i<len; i+=2) {
                  if (lineRE.test(lines[i])) {
                      lines[j++] = (RegExp.$3 ?
                          RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 :
                          ANON + RegExp.$2 + ':' + RegExp.$1) +
                          ' -- ' + lines[i+1].replace(/^\s+/,'');
                  }
              }
  
              lines.splice(j,lines.length-j);
              return lines;
          }
      };
  
      default : return function () {
          var curr  = arguments.callee.caller,
              FUNC  = 'function', ANON = "{anonymous}",
              fnRE  = /function\s*([\w\-$]+)?\s*\(/i,
              stack = [],j=0,
              fn,args,i;
  
          while (curr) {
              fn    = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
              args  = stack.slice.call(curr.arguments);
              i     = args.length;
  
              while (i--) {
                  switch (typeof args[i]) {
                      case 'string'  : args[i] = '"'+args[i].replace(/"/g,'\\"')+'"'; break;
                      case 'function': args[i] = FUNC; break;
                  }
              }
  
              stack[j++] = fn + '(' + args.join() + ')';
              curr = curr.caller;
          }
  
          return stack;
      };
  }
}());
var troonline_errorlog = "";
function logError(msg)
{
  troonline_errorlog = msg + troonline_errorlog;
}   
function flushLog()
{
  // TODO: Only display the message to editors and admins, but hide the errors and
  // log it in a database for everyone else.
  // display message
  if (troonline_errorlog != "")
  {
	  document.getElementById("debugoutput").innerHTML = troonline_errorlog;
  }
}
//// Set up a global error handler and spit out a stack trace inside it
//window.onerror = function(message, uri, line)
//{
//  logError("Error: " + message + " @ " + uri + ": " + line);
//  if (typeof(console) != 'undefined')
//  {
//    console.log("Error: " + message + " @ " + uri + ": " + line);
//  }
////  var fullMessage = message + "\n at " + uri + ": " + line;
////  remoteLogger.log(fullMessage);
//  // Let the browser take it from here
//  return true;
//}

// NOTE: If you need a CSS debugger for browsers OTHER than firefox.
// go to http://joshascript.com/dischover/.

