//
Number.prototype.pad = function(_width) {
  var strnum = new String(this);
  var padWidth=_width-strnum.length;
  if (padWidth<1) return strnum;
  return "00000000000000000000000".substr(0,padWidth)+strnum;
}
//

if (typeof(console) == "undefined") {
 console = new Object();
 console.log = function() {};
}

function LogEntry(_entryName) {
  this.entryName = _entryName;
  this.hits = 0;
  this.elapsed = 0;
  this.startDate = null;
  this.stopDate = null;
}
LogEntry.prototype.start = function() {
  this.startDate=new Date();
}
LogEntry.prototype.stop = function() {
  this.stopDate=new Date();
  this.hits++;
  this.elapsed += this.stopDate - this.startDate;
//  alert("stop ="+this.stopDate+"."+this.stopDate.getMilliseconds()+"\nstart="+this.startDate+"."+this.startDate.getMilliseconds())
}
//
function Log(className, severity) {
  this.className = className;
  var entry=log4js.fetchEntry(className);
  this.methodStack = [];
  if (severity) this.setLogLevel(severity);
}
Log.prototype.setGlobalLogLevel = function(logLevel) {
  if (!local) log4js.setLogLevel(logLevel);
}
Log.prototype.setLogLevel = function(logLevel) {
  var severity = log4js.severity;
  this._setLogMethods(logLevel);
}
Log.prototype.setGlobalLogMethods = function(logLevel) {
  var lp = Log.prototype;
  if (logLevel&log4js.FATAL) lp.fatal = lp._fatal; else lp.fatal = lp._abyss;
  if (logLevel&log4js.ERROR) lp.error = lp._error; else lp.error = lp._abyss;
  if (logLevel&log4js.WARN)  lp.warn  = lp._warn;  else lp.warn  = lp._abyss;
  if (logLevel&log4js.INFO)  lp.info  = lp._info;  else lp.info  = lp._abyss;
  if (logLevel&log4js.DEBUG) lp.debug = lp._debug; else lp.debug = lp._abyss;
  if (logLevel&log4js.TRACE) lp.trace = lp._trace; else lp.trace = lp._abyss;
  if (logLevel & log4js.PROFILE) {
    lp.enter = lp._enter;
    lp.exit = lp._exit;
  } else {
    lp.enter = lp._abyss;
    lp.exit = lp._abyss;
  }
}
Log.prototype._setLogMethods = function(logLevel) {
  var lp = Log.prototype;
  if (logLevel&log4js.FATAL) this.fatal = lp._fatal; else delete this.fatal;
  if (logLevel&log4js.ERROR) this.error = lp._error; else delete this.error;
  if (logLevel&log4js.WARN)  this.warn  = lp._warn;  else delete this.warn;
  if (logLevel&log4js.INFO)  this.info  = lp._info;  else delete this.info;
  if (logLevel&log4js.DEBUG) this.debug = lp._debug; else delete this.debug;
  if (logLevel&log4js.TRACE) this.trace = lp._trace; else delete this.trace;
  if (logLevel & log4js.PROFILE) {
    this.enter = lp._enter;
    this.exit = lp._exit;
  } else {
    delete this.enter;
    delete this.exit;
  }
}

Log.prototype._abyss = function() {return;}
Log.prototype._fatal = function(_message) { log4js.log("FATAL",this.className,_message); }
Log.prototype._error = function(_message) { log4js.log("ERROR",this.className,_message); }
Log.prototype._warn =  function(_message) { log4js.log("WARN ",this.className,_message); }
Log.prototype._info =  function(_message) { log4js.log("INFO ",this.className,_message); }
Log.prototype._debug = function(_message) { log4js.log("DEBUG",this.className,_message); }
Log.prototype._trace = function(_message) { log4js.log("TRACE",this.className,_message); }
Log.prototype._enter = function(_method) {
 var entry=log4js.fetchEntry(this.className+":"+_method);
 entry.start();
 log4js.log("ENTER",this.className,"Entering: "+_method);
 var argc = arguments.length;
 for(var i=1;i<argc;i++) {
  var arg = arguments[i];
  var objtype = typeof(arg);
  if (arg["category"]) {objtype = arg["category"];}
  log4js.log("ARGUMENTS["+i+"]", this.className, ""+objtype+"("+arg+")");
 }
}
Log.prototype._exit = function(_method) {
  log4js.log("EXIT",this.className,"Exiting: "+_method);
  var entry=log4js.getEntry(this.className+":"+_method);
  entry.stop();
}

Log.prototype.fatal   = Log.prototype._abyss;
Log.prototype.error   = Log.prototype._abyss;
Log.prototype.warn    = Log.prototype._abyss;
Log.prototype.info    = Log.prototype._abyss;
Log.prototype.debug   = Log.prototype._abyss;
Log.prototype.trace   = Log.prototype._abyss;
Log.prototype.profile = Log.prototype._abyss;
Log.prototype.enter   = Log.prototype._abyss;
Log.prototype.exit    = Log.prototype._abyss;

////////////
Log4js.prototype.addEntry = function(_entryName) {
  var entry  = new LogEntry(_entryName);
  this.entryMap[_entryName] = entry;
  return entry;
}
Log4js.prototype.getEntry = function(_entryName) {
  return this.entryMap[_entryName];
}
Log4js.prototype.fetchEntry = function(_entryName) {
  var entry = this.getEntry(_entryName);
  if (entry==null) {
  	entry = this.addEntry(_entryName);
  }
  return entry;
}
Log4js.prototype._formatTimestamp = function(_ts) {
  if (_ts==null) _ts = new Date();
  switch(this.TSSHORT) { 
    case this.TSSHORT: return _ts.getMonth().pad(2)+"/"+_ts.getDate().pad(2)+"/"+(_ts.getYear()-100).pad(2)+" "+_ts.getHours()+":"+_ts.getMinutes().pad(2)+":"+_ts.getSeconds().pad(2); break;
    case this.TSLONG:  return _ts.getMonth().pad(2)+"/"+_ts.getDate().pad(2)+"/"+(_ts.getYear()-100)+" "+_ts.getHours().pad(2)+":"+_ts.getMinutes().pad(2)+":"+_ts.getSeconds().pad(2); break;
    case this.TSDATE:  return _ts.getMonth().pad(2)+"/"+_ts.getDate().pad(2)+"/"+(_ts.getYear()-100); break;
    case this.TSTIME:  return _ts.getHours().pad(2)+":"+_ts.getMinutes().pad(2)+":"+_ts.getSeconds().pad(2); break; 
  }
  return
}
//Log4js.prototype.log = function(_severity,_entryName,_message) {
Log4js.prototype.log = function(_severity,_entryName,_message) {
  var dt = this._formatTimestamp();
  if (typeof(_message) == "Exception") {
    console.log("EXCEPTION: "+_message);
  } else {
    console.log(dt+","+_severity+","+_entryName+","+_message);
  }
}
Log4js.prototype.dump = function() {
  var i=0;
  for(entryName in this.entryMap) {
    var entry = this.entryMap[entryName];
  	this.log("INFO ",entry.entryName,entry.hits+", "+entry.elapsed+", "+(entry.elapsed/entry.hits).toFixed(2));
  }
}
Log4js.prototype.formatObject = function(e,d) {
  var _nl = "\n";
  if (d) {
    _nl = d;
  }
  if (dojo.isString(e)) return e;
  var _msg = "";
  for(var _k in e) {
   var _v = e[_k];
  	_msg += "--"+_k+": "+_v+_nl;
  }
  return _msg;
}
Log4js.prototype.showConsole = function() {
//  if (this.console==null||this.console.closed) {
//    this.console = window.open ("profile.html","profile","status=0,menubar=0,resizable=1,width=800,height=750,scrollbars=1,addressbar=0");
//  }

  try {
//    this.console.moveTo(0,1610);
  } catch (e) {
//    alert("logger "+this.formatObject(e,false));
  }
}
function Log4js() {
 this.entryMap = new Object();
 this.dtfmt = this.TSSHORT;

 this.TSSHORT=1;
 this.TSLONG=2;
 this.TSDATE=3;
 this.TSTIME=4;

 this.FATAL=1;
 this.ERROR=2;
 this.WARN=4;
 this.INFO=8;
 this.DEBUG=16;
 this.TRACE=32;
 this.PROFILE=64;
 
 this.NONE=0;
 this.ALL=255;
}

var log4js = new Log4js();

showException = log4js.formatObject;

//Log.prototype.setGlobalLogMethods(0);
