String.prototype.toAsciiLowerCase = function () { var output = ""; for (var i = 0, len = this.length; i < len; ++i) { if (this.charCodeAt(i) >= 0x41 && this.charCodeAt(i) <= 0x5A) { output += String.fromCharCode(this.charCodeAt(i) + 0x20) } else { output += this.charAt(i); } } return output; } function indent(ancestors) { var str = ""; if (ancestors > 0) { while (ancestors--) str += " "; } return str; } function dom2string(node, ancestors) { var str = ""; if (typeof ancestors == "undefined") var ancestors = 0; if (!node.firstChild) return "| "; var parent = node; var current = node.firstChild; var next = null; var misnested = null; for (;;) { str += "\n| " + indent(ancestors); switch (current.nodeType) { case 10: str += ''; break; case 8: try { str += ''; } catch (e) { str += ''; } if (parent != current.parentNode) { return str += ' (misnested... aborting)'; } break; case 7: str += ''; break; case 4: str += ''; break; case 3: str += '"' + current.nodeValue + '"'; if (parent != current.parentNode) { return str += ' (misnested... aborting)'; } break; case 1: str += "<"; switch (current.namespaceURI) { case "http://www.w3.org/2000/svg": str += "svg "; break; case "http://www.w3.org/1998/Math/MathML": str += "math "; break; } if (current.localName && current.namespaceURI && current.namespaceURI != null) { str += current.localName; } else { str += current.nodeName.toAsciiLowerCase(); } str += '>'; if (parent != current.parentNode) { return str += ' (misnested... aborting)'; } else { if (current.attributes) { var attrNames = []; var attrPos = {}; for (var j = 0; j < current.attributes.length; j += 1) { if (current.attributes[j].specified) { var name = ""; switch (current.attributes[j].namespaceURI) { case "http://www.w3.org/XML/1998/namespace": name += "xml "; break; case "http://www.w3.org/2000/xmlns/": name += "xmlns "; break; case "http://www.w3.org/1999/xlink": name += "xlink "; break; } if (current.attributes[j].localName) { name += current.attributes[j].localName; } else { name += current.attributes[j].nodeName; } attrNames.push(name); attrPos[name] = j; } } if (attrNames.length > 0) { attrNames.sort(); for (var j = 0; j < attrNames.length; j += 1) { str += "\n| " + indent(1 + ancestors) + attrNames[j]; str += '="' + current.attributes[attrPos[attrNames[j]]].nodeValue + '"'; } } } if (next = current.firstChild) { parent = current; current = next; ancestors++; continue; } } break; } for (;;) { if (next = current.nextSibling) { current = next; break; } current = current.parentNode; parent = parent.parentNode; ancestors--; if (current == node) { return str.substring(1); } } } }