var objs = [ "window", "document.body", "document.documentElement", "document" ];
var attrs = [ "innerHeight", "offsetHeight", "clientHeight", "scrollHeight",
              "pageYOffset", "scrollTop",
              "innerWidth", "offsetWidth", "clientWidth", "scrollWidth",
              "pageXOffset", "scrollLeft" ];

function appendOutput(s) {
    document.forms["output"].elements["txt"].value += s;
}

function handleError(msg, url, ln) {
    appendOutput("undefined\n");
    rowresult += "undefined,";
    return true;
}


var objIndex;
var attrIndex;
var rowheader;
var rowresult;

function showProperties(doctype) {
    window.onerror = handleError;
    //  using a timer to loop, so that we can catch errors on old browsers like ie4
    document.forms["output"].elements["txt"].value = "";
    appendOutput(navigator.userAgent + "\n");
    appendOutput(doctype ? "doctype (standards)\n" : "no doctype (quirks)\n");
    rowresult = (doctype ? "doctype (standards)," : "no doctype (quirks),")
              + "\"" + navigator.userAgent + "\",";
    rowheader = "mode,user agent,";
    objIndex = 0;
    attrIndex = 0;
    setTimeout("queryProperty()", 100);
}

function queryProperty() {
    var expr = objs[objIndex] + "." + attrs[attrIndex];
    //  loop logic
    var isDone = false;
    if (++attrIndex >= attrs.length) {
        attrIndex = 0;
        objIndex++;
        if (objIndex >= objs.length) {
            isDone = true;
        }
    }
    appendOutput(expr + " = ");
    rowheader += expr + ",";
    //  set timer before we do anything that could trigger an error
    if (!isDone) {
        setTimeout("queryProperty()", 100);
    }
    else {
        setTimeout("finish()", 100);
    }
    var value = eval(expr);
    //  no error, woo
    appendOutput(value + "\n");
    rowresult += value + ",";
}

function finish() {
    window.onerror = null;
    appendOutput("\n" + rowresult + "\n\n" + rowheader + "\n");
    alert("Done!");
}

//function showHeights(doctype) {
//  var result = navigator.userAgent;
//  var rowresult;
//  result += (doctype ? " doctype (standards)\n" : " no doctype (quirks)\n");
//  rowresult = (doctype ? "doctype (standards), " : "no doctype (quirks), ")
//              + "\"" + navigator.userAgent + "\", ";
//  var rowheader = "mode, user agent, ";
//  var i;
//  var j;
//  for (i=0; i<objs.length; i++) {
//    for (j=0; j<attrs.length; j++) {
//      var expr = objs[i] + "." + attrs[j];
//      result += (expr + " = " + eval(expr) + "\n");
//      rowresult += eval(expr) + ", ";
//      rowheader += expr + ", ";
//	}
//  }
//  document.forms["output"].elements["txt"].value = result + "\n\n" + rowresult
//                                                   + "\n\n" + rowheader;
//}
