Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* DOM dumper [0.0.3], 
 Original from http://en.wikipedia.org/wiki/User:Splarka/domdump.js

Dumps the dom or object structure of the element specified by the URL parameters:
* domdump=object (also has parameter: dumpcrop=#, length to crop attributes/text nodes)
* objdump=object
and creates a textarea in the contentSub of the results, with space indented tree structure.

Object can be specified by: ID, name, tag name, or class name. The first result is always 
taken. So for example, you can domdump=html to dump the whole object.

To do:
* Allow exclusion of text/comments?
* Allow specific faux tag formatting?
* Allow custom indent structure?
*/

if(queryString('domdump') || queryString('objdump')) addOnloadHook(domDump);
var dumpCrop = '20';
var findDepth = 0;
function domDump() {
  var objid = (queryString('domdump')) ? queryString('domdump') : queryString('objdump')
  var obj = getElementByWhatever(objid);
  if(!obj) return;

  if(queryString('dumpcrop')) dumpCrop = parseInt(queryString('dumpcrop'))
  if(queryString('domdump')) {
    //call function to recall children elements recursively
    var text = '[DOM dump of "' + objid + '"]\n' + dumpChildren(obj);
  } else {
    //use javascript for-in
    var text = centerbuffer(' Object dump of "' + objid + '" ','=',80) + '\n';
    for(var i in obj) {
      text += centerbuffer(' ' + i + ' ','-',80) + '\n' + obj[i] + '\n';
    }
  }

  //show dump after, so we don't pollute the results
  var show = (document.getElementById('contentSub')) ? document.getElementById('contentSub') : document.getElementById('topbar')
  if(!show) return;
   var out = document.createElement('textarea');
   out.style.width = '100%';
   out.style.height = '30em';
   out.value = text;
  show.appendChild(out);
}

function centerbuffer(txt,chr,width) {
  var buf = '';
  var num = parseInt((width - txt.length + 1) / 2);
  for(var i=0;i<num;i++) { 
    buf += chr.substr(0,1);
  }
  var ctxt = buf + txt + buf;
  ctxt = ctxt.substr(0,width);
  return ctxt;
}

function dumpChildren(obj,func) {
  var childs = 0; var txt = ''; var txtafter = ''; var indent = '';
  for(var i=0;i<findDepth;i++) indent += '  '
  switch (obj.nodeType) {
    case(1): 
      var attr = '';
      for(var i=0;i<obj.attributes.length;i++) {
        var anam = obj.attributes[i].nodeName.toLowerCase();
        var aval = obj.attributes[i].nodeValue;
        if(aval.length > dumpCrop) aval = aval.substr(0,dumpCrop) + '...'
        attr += anam + '="' + aval + '" ';
      }
      if(attr.length > 0) attr = ' ' + attr.replace(/ $/,'');
      txt += indent + '<' + obj.tagName.toLowerCase() + attr + '>\n';
      txtafter = indent + '</' + obj.tagName.toLowerCase() + '>\n';
    break;
    case(3): 
      var val = escapeSome(obj.nodeValue);
      if(val.length > dumpCrop) val = val.substr(0,dumpCrop) + '...';
      txt += indent + '[text length="' + obj.nodeValue.length + '"]' + val + '[/text]\n';
    break;
    case(8): 
      var val = escapeSome(obj.nodeValue);
      if(val.length > dumpCrop) val = val.substr(0,dumpCrop) + '...';
      txt += indent + '[comment length="' + obj.nodeValue.length + '"]' + val + '[/comment]\n';
    break;
  }

  while(obj.childNodes[childs]) {
    findDepth++;
    txt += dumpChildren(obj.childNodes[childs]);
    findDepth--;
    childs++;
  }
  if(obj.nodeType == 1) txt += txtafter
  return txt;
}

function escapeSome(str) {
  //return, linefeed, tabs
  str = str.replace(/\r/g,'\\r').replace(/\n/g,'\\n').replace(/\t/g,'\\t');
  // invisible unicodes, convert to JS entities
  var eucChars = [160,173,847,1536,1537,1538,1539,1757,1807,3852,4447,4448,5760,6155,6156,6157,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8209,8232,8233,8234,8235,8236,8237,8238,8239,8239,8260,8287,8288,8289,8290,8291,8292,8298,8299,8300,8301,8302,8303,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12288,12350,65279,65408,65532]
  for(var i=0;i<eucChars.length;i++) {
    var pattern = new RegExp(String.fromCharCode(eucChars[i]),'g');
    if(str.search(pattern)!=-1) str = str.replace(pattern,'\\u' + hx4(eucChars[i]) + '')
  }
  return str;
}

function hx4(dec) {
  var h = dec.toString(16);
  while(h.length < 4) h = '0' + h;
  return h;
}

function queryString(p) {
  var re = RegExp('[&?]' + p + '=([^&]*)');
  var matches;
  if (matches = re.exec(document.location)) {
    try { 
      return decodeURI(matches[1]);
    } catch (e) {
    }
  }
  return null;
}

function getElementByWhatever(thing,par) {
  var parent = (!par) ? document : par
  if(parent.getElementById(thing)) {
    return parent.getElementById(thing);
  } else if(parent.getElementsByName(thing)[0]) {
    return parent.getElementsByName(thing)[0];
  } else if(parent.getElementsByTagName(thing)[0]) {
    return parent.getElementsByTagName(thing)[0];
  } else {
    var c = getElementsByClassName(parent,'*',thing);
    if(c.length > 0) {
      return c[0];
    } else {
      return false;
    }
  }
}