Rev 1987 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<html>
<head>
<title>Deep Debugger</title>
<script>
var tableRows = {};
var tableCels = {};
var tableObjs = {};
var tablesBuilt = {};
var tableShows = {};
var tableHides = {};
// IE: nodes w/id need to be redeclared or getElementById is b0rked
var frame = null;
window.onload = function(){
// if IE loads this page too quickly (instantly) then
// window.debugVar might not have been set
window.setTimeout(startMeUp, 100);
}
function startMeUp(){
frame = document.getElementById('frame');
// GET string
var index = location.search.split("=").pop();
var debugObj = window.opener.dojo.debugDeep;
var debugVar = debugObj.debugVars[index] || window.debugVar;
buildTable('root', frame, debugVar);
}
function buildTable(path, parent, obj){
var keys = [];
var vals = [];
for(var prop in obj){
keys.push(prop);
try {
vals[prop] = obj[prop];
} catch(E) {
vals[prop] = 'ERROR: ' + E.message;
}
}
keys.sort(keySorter);
if (!keys.length){
var div = document.createElement('div');
div.appendChild(document.createTextNode('Object has no properties.'));
parent.appendChild(div);
return;
}
var t = document.createElement('table');
t.border = "1";
var tb = document.createElement('tbody');
t.appendChild(tb);
for(var i = 0; i < keys.length; i++) {
buildTableRow(path+'-'+keys[i], tb, keys[i], vals[keys[i]]);
}
if (path == 'root'){
//t.style.width = '90%';
}
t.style.width = '100%';
parent.appendChild(t);
tablesBuilt[path] = true;
}
function buildTableRow(path, tb, name, value) {
var simpleType = typeof(value);
var createSubrow = (simpleType == 'object');
var complexType = simpleType;
if (simpleType == 'object'){
var cls = getConstructorClass(value);
if (cls){
if (cls == 'Object'){
}else if (cls == 'Array'){
complexType = 'array';
}else{
complexType += ' ('+cls+')';
}
}
}
/*var tr1 = document.createElement('tr');
var td1 = document.createElement('td');
var td2 = document.createElement('td');
var td3 = document.createElement('td');
var td4 = document.createElement('td');*/
var row = tb.rows.length;
var tr1 = tb.insertRow(row++);
var td1 = tr1.insertCell(0);
var td2 = tr1.insertCell(1);
var td3 = tr1.insertCell(2);
var td4 = tr1.insertCell(3);
tr1.style.verticalAlign = 'top';
td1.style.verticalAlign = 'middle';
td1.className = 'propPlus';
td2.className = 'propName';
td3.className = 'propType';
td4.className = 'propVal';
//tr1.appendChild(td1);
//tr1.appendChild(td2);
//tr1.appendChild(td3);
//tr1.appendChild(td4);
if (createSubrow){
var img1 = document.createElement('img');
img1.width = 9;
img1.height = 9;
img1.src = 'arrow_show.gif';
var a1 = document.createElement('a');
a1.appendChild(img1);
a1.href = '#';
a1.onclick = function(){ showTableRow(path); return false; };
var img2 = document.createElement('img');
img2.width = 9;
img2.height = 9;
img2.src = 'arrow_hide.gif';
var a2 = document.createElement('a');
a2.appendChild(img2);
a2.href = '#';
a2.onclick = function(){ hideTableRow(path); return false; };
a2.style.display = 'none';
tableShows[path] = a1;
tableHides[path] = a2;
td1.appendChild(a1);
td1.appendChild(a2);
}else{
var img = document.createElement('img');
img.width = 9;
img.height = 9;
img.src = 'spacer.gif';
td1.appendChild(img);
}
td2.appendChild(document.createTextNode(name));
td3.appendChild(document.createTextNode(complexType));
td4.appendChild(buildPreBlock(value));
//tb.appendChild(tr1);
if (createSubrow){
var tr2 = tb.insertRow(row++);
var td5 = tr2.insertCell(0);
var td6 = tr2.insertCell(1);
//var tr2 = document.createElement('tr');
//var td5 = document.createElement('td');
//var td6 = document.createElement('td');
td5.innerHTML = ' ';
//td6.innerHTML = ' ';
td6.colSpan = '3';
tr2.appendChild(td5);
tr2.appendChild(td6);
tr2.style.display = 'none';
tb.appendChild(tr2);
tableRows[path] = tr2;
tableCels[path] = td6;
tableObjs[path] = value;
}
}
function showTableRow(path){
var tr = tableRows[path];
var td = tableCels[path];
var a1 = tableShows[path];
var a2 = tableHides[path];
if (!tablesBuilt[path]){
//alert('building table for '+path);
buildTable(path, td, tableObjs[path]);
}
tr.style.display = 'table-row';
a1.style.display = 'none';
a2.style.display = 'inline';
}
function hideTableRow(path){
var tr = tableRows[path];
var a1 = tableShows[path];
var a2 = tableHides[path];
tr.style.display = 'none';
a1.style.display = 'inline';
a2.style.display = 'none';
}
function buildPreBlock(value){
//
// how many lines ?
//
var s = ''+value;
s = s.replace("\r\n", "\n");
s = s.replace("\r", "");
var lines = s.split("\n");
if (lines.length < 2){
if (lines[0].length < 60){
var pre = document.createElement('pre');
pre.appendChild(document.createTextNode(s));
return pre;
}
}
//
// multiple lines :(
//
var preview = lines[0].substr(0, 60) + ' ...';
var pre1 = document.createElement('pre');
pre1.appendChild(document.createTextNode(preview));
pre1.className = 'clicky';
var pre2 = document.createElement('pre');
pre2.appendChild(document.createTextNode(s));
pre2.style.display = 'none';
pre2.className = 'clicky';
pre1.onclick = function(){
pre1.style.display = 'none';
pre2.style.display = 'block';
}
pre2.onclick = function(){
pre1.style.display = 'block';
pre2.style.display = 'none';
}
var pre = document.createElement('div');
pre.appendChild(pre1);
pre.appendChild(pre2);
return pre;
}
function getConstructorClass(obj){
if (!obj.constructor || !obj.constructor.toString) return;
var m = obj.constructor.toString().match(/function\s*(\w+)/);
if (m && m.length == 2) return m[1];
return null;
}
function keySorter(a, b){
if (a == parseInt(a) && b == parseInt(b)){
return (parseInt(a) > parseInt(b)) ? 1 : ((parseInt(a) < parseInt(b)) ? -1 : 0);
}
// sort by lowercase string
var a2 = String(a).toLowerCase();
var b2 = String(b).toLowerCase();
return (a2 > b2) ? 1 : ((a2 < b2) ? -1 : 0);
}
</script>
<style>
body {
font-family: arial, helvetica, sans-serif;
}
table {
border-width: 0px;
border-spacing: 1px;
border-collapse: separate;
}
td {
border-width: 0px;
padding: 2px;
}
img {
border: 0;
}
pre {
margin: 0;
padding: 0;
white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
white-space: -pre-wrap; /* Opera 4 - 6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
word-wrap: break-word; /* IE 5.5+ */
}
pre.clicky {
cursor: hand;
cursor: pointer;
}
td.propPlus {
width: 9px;
background-color: #ddd;
}
td.propName {
background-color: #ddd;
}
td.propType {
background-color: #ddd;
}
td.propVal {
background-color: #ddd;
}
</style>
</head>
<body>
<h2>Javascript Object Browser</h2>
<div id="frame"></div>
</body>
</html>