function show(obj,nosort) {  if (typeof(obj) != "object" && typeof(obj) != "function") {return obj}  if (!obj) {return "NULL"}  var id = []; var fn = []; var err = [];  var i; var string = "=====================\n";  for (i in obj) {    // Mozilla (PC) can fail to take typeof for some objects.  Grr!    try {      if (typeof(obj[i]) == 'function')         {fn[fn.length] = i} else {id[id.length] = i}    } catch (error) {err[err.length] = i}  }  if (nosort == null) {    id.sort(function(a,b) {return (a.toLowerCase() < b.toLowerCase()) ? -1 : 1});    fn.sort(function(a,b) {return (a.toLowerCase() < b.toLowerCase()) ? -1 : 1});    err.sort(function(a,b) {return (a.toLowerCase() < b.toLowerCase()) ? -1 : 1});  }  var last = null;  for (i=0; i<id.length; i++) {    if (id[i] != last) {// avoid duplicates in Safari      // MSIE (PC) crashes if we pass unknown objects to valueFor()      //   so handle them here      string += id[i] + ' = '             + ((typeof(obj[id[i]]) == 'unknown') ? 'UNKNOWN' : valueFor(obj[id[i]]))             + '\n';      last = id[i];    }  }  if (fn.length) {string += '---------------------\n'}  for (i=0; i<fn.length; i++) {    if (fn[i] != last) {      string += fn[i] + ' = ' + valueFor(obj[fn[i]]) + '\n';      last = fn[i];    }  }  if (err.length) {string += '---------------------\n'}  for (i=0; i<err.length; i++) {string += err[i] + ' = ERROR\n'}  return string;}function valueFor(obj) {  switch (typeof(obj)) {    case 'number':    case 'undefined':      return obj;    case 'string':      return '"' + obj + '"';    case 'function':      return "[function]";    case 'object':      if (!obj) {return "[null]"}      return "[object]";  }  return '[unknown]';}