Logo
doctype [?]
[strict] [loose] [none]

Data Dumper



Source Type:Fully formatted code - Best for understanding and editing
Source File:datadumper.js (Right-click and "save as")
File size:4k


PLEASE SUPPORT THIS SITE! Rather than charging money for this site, I rely on donations from users to help support the site and offset development time. If you find this code useful or if it helped on your project, please consider donating. Any amount is appreciated! Thanks!
/**
 * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
 * 
 * Dual licensed under the MIT and GPL licenses. 
 * This basically means you can use this code however you want for
 * free, but don't claim to have written it yourself!
 * Donations always accepted: http://www.JavascriptToolbox.com/donate/
 * 
 * Please do not link to the .js files on javascripttoolbox.com from
 * your site. Copy the files locally to your server instead.
 * 
 */
var Dumper = (function(){
  // "Private"
  var maxIterations = 1000;
  var maxDepth = -1; // Max depth that Dumper will traverse in object
  var iterations = 0;
  var indent = 1;
  var indentText = " ";
  var newline = "\n";
  var object = null; // Keeps track of the root object passed in
  var properties = null; // Holds properties of top-level object to traverse - others are ignored

  function args(a,index) {
    var myargs = new Array();
    for (var i=index; i<a.length; i++) {
      myargs[myargs.length] = a[i];
    }
    return myargs;
  };

  function pad(len) {
    var ret = "";
    for (var i=0; i<len; i++) {
      ret += indentText;
    }
    return ret;
  };

  function string(o) {
    var level = 1;
    var indentLevel = indent;
    var ret = "";
    if (arguments.length>1 && typeof(arguments[1])=="number") {
      level = arguments[1];
      indentLevel = arguments[2];
      if (o == object) {
        return "[original object]";
      }
    }
    else {
      iterations = 0;
      object = o;
      // If a list of properties are passed in
      if (arguments.length>1) {
        var list = arguments;
        var listIndex = 1;
        if (typeof(arguments[1])=="object") {
          list = arguments[1];
          listIndex = 0;
        }
        for (var i=listIndex; i<list.length; i++) {
          if (properties == null) { properties = new Object(); }
          properties[list[i]]=1;
        }
      }
    }
    if (iterations++>maxIterations) { return "[Max Iterations Reached]"; } // Just in case, so the script doesn't hang
    if (maxDepth != -1 && level > (maxDepth+1)) {
      return "...";
    }
    // undefined
    if (typeof(o)=="undefined") {
      return "[undefined]";
    }
    // NULL
    if (o==null) {
      return "[null]";
    }
    // DOM Object
    if (o==window) {
      return "[window]";
    }
    if (o==window.document) {
      return "[document]";
    }
    // FUNCTION
    if (typeof(o)=="function") {
      return "[function]";
    } 
    // BOOLEAN
    if (typeof(o)=="boolean") {
      return (o)?"true":"false";
    } 
    // STRING
    if (typeof(o)=="string") {
      return "'" + o + "'";
    } 
    // NUMBER  
    if (typeof(o)=="number") {
      return o;
    }
    if (typeof(o)=="object") {
      if (typeof(o.length)=="number" ) {
        // ARRAY
        if (maxDepth != -1 && level > maxDepth) {
          return "[ ... ]";
        }
        ret = "[";
        for (var i=0; i<o.length;i++) {
          if (i>0) {
            ret += "," + newline + pad(indentLevel);
          }
          else {
            ret += newline + pad(indentLevel);
          }
          ret += string(o[i],level+1,indentLevel-0+indent);
        }
        if (i > 0) {
          ret += newline + pad(indentLevel-indent);
        }
        ret += "]";
        return ret;
      }
      else {
        // OBJECT
        if (maxDepth != -1 && level > maxDepth) {
          return "{ ... }";
        }
        ret = "{";
        var count = 0;
        for (i in o) {
          if (o==object && properties!=null && properties[i]!=1) {
            // do nothing with this node
          }
          else {
            if (typeof(o[i]) != "unknown") {
              var processAttribute = true;
              // Check if this is a DOM object, and if so, if we have to limit properties to look at
              if (o.ownerDocument|| o.tagName || (o.nodeType && o.nodeName)) {
                processAttribute = false;
                if (i=="tagName" || i=="nodeName" || i=="nodeType" || i=="id" || i=="className") {
                  processAttribute = true;
                }
              }
              if (processAttribute) {
                if (count++>0) {
                  ret += "," + newline + pad(indentLevel);
                }
                else {
                  ret += newline + pad(indentLevel);
                }
                ret += "'" + i + "' => " + string(o[i],level+1,indentLevel-0+i.length+6+indent);
              }
            }
          }
        }
        if (count > 0) {
          ret += newline + pad(indentLevel-indent);
        }
        ret += "}";
        return ret;
      }
    }
  };

  string.popup = function(o) {
    var w = window.open("about:blank");
    w.document.open();
    w.document.writeln("<HTML><BODY><PRE>");
    w.document.writeln(string(o,args(arguments,1)));
    w.document.writeln("</PRE></BODY></HTML>");
    w.document.close();
  };

  string.alert = function(o) {
    alert(string(o,args(arguments,1)));
  };

  string.write = function(o) {
    var argumentsIndex = 1;
    var d = document;
    if (arguments.length>1 && arguments[1]==window.document) {
      d = arguments[1];
      argumentsIndex = 2;
    }
    var temp = indentText;
    indentText = "&nbsp;";
    d.write(string(o,args(arguments,argumentsIndex)));
    indentText = temp;
  };
  
  string.setMaxIterations = function(i) {
    maxIterations = i;
  };
  
  string.setMaxDepth = function(i) {
    maxDepth = i;
  };

  string.$VERSION = 1.0;
  
  return string;
})();