var DataDumperLineNum;
var DataDumperDoc;
var DataDumperSeenRefs;
var DataDumperIgnore = new Array();
var DataDumperMaxDepth = 25;
function Dumper(data,name) {
  DataDumperLineNum = 0;
  DataDumperSeenRefs = new Array();
  if (! data) data = this;
  if (! name) name = '_blank';
  var w = window.open('',name,'resizeable,scrollbars');
  w.focus();
  DataDumperDoc= w.document.open();  
  DataDumperDoc.write("<html><body><pre>REF=\x0A");
  DataDumperPrintData(data,1);
  DataDumperDoc.write('</pre></body></html>');
  DataDumperDoc.close();
}
function DataDumperPrintData(data, depth) {
  if (depth == DataDumperMaxDepth ) {
    DataDumperDoc.write(' -- MAX DEPTH --\x0A');
    return;
  }
  for (var i in data) {
    DataDumperLineNum++;
    DataDumperDoc.write(DataDumperLineNum+' ');
    for (var j=0; j < depth; j++) { DataDumperDoc.write('  '); }
    if (typeof data[i] != 'object') {
      DataDumperDoc.write('['+i+'] = '+escape(data[i])+" ("+typeof data[i]+")\x0A");
    } else if (data[i] == null) {
      DataDumperDoc.write('['+i+"] = null\x0A");
    } else if (data[i] == undefined) {
      DataDumperDoc.write('['+i+"] = undefined\x0A");
    } else if (DataDumperSeenRefs[data[i].toString()]) {
     DataDumperDoc.write('['+i+"] = ref at line "+DataDumperSeenRefs[data[i]]+"\x0A");
    } else {
      DataDumperSeenRefs[data[i].toString()] = DataDumperLineNum;

      var print_this_one = true;
      for (var j=0; j < DataDumperIgnore.length; j++) {
        if (DataDumperIgnore[j] == i) {
          print_this_one = false;
          break;
        }
      }
      if (print_this_one == false) { 
        DataDumperDoc.write('['+i+'] = ignored\x0A');
      } else {
        DataDumperDoc.write('['+i+'] = \x0A');
        DataDumperPrintData(data[i],depth+1);
      }
    }
  }
}

