function keys(o) {
  var ks = [];
  for (var k in o) {
    ks.push(k);
  }
  return ks;
}

function all(o) {
  var ks = keys(o);
  ks.sort();
  var s = '';
  for (var i in ks) {
    s += ks[i] + '\n';
  }
  return s;
}

function attrs(o) {
  var s = '<div style="margin-left: 2em">';
  for (var k in o) {
    if (typeof o[k] != 'function') {
      s += '<pre>' + k + ': ' + o[k] + '</pre>';
    }
  }
  return s + '</div>';
}

function __Class__(o) {
  var s = Object.prototype.toString.apply(o);
  return s.substring(8, s.length - 1);
}

function showException(exc) {
  var text = '<div class="testException"><div>exception thrown: ' + exc + '</div>';
  var s = String(exc);
  if ('message' in exc && s.indexOf(exc.message) == -1) {
    text += '<div>' + exc.message + '</div>';
  }
  return text + '</div>';
}

function enumerable(o, p) {
  for (var k in o) {
    if (k == p) {
      return true;
    }
  }
  return false;
}
