Dumping objects to HTML

Use this class to dump javascript objects to ul-based HTML tree structure.

Required classes: Utils и Comparator.


function Dump() {}

Dump.toHtml = function(obj, name, className) {
	name = name || '';
	className = className || 'collapsibleTree';
	var rootNode = document.createElement('div');
	rootNode.className = className;
	rootNode.appendChild(Dump.node(obj, name));
	return rootNode;
};

Dump.typeNames = [
	'',
	'Array',
	'Object',
	'String',
	'Number',
	'Boolean',
	'Function',
	'Date',
	'Null',
	'Undefined'
];

Dump.handleCollapserClick = function(evt) {
	evt = evt || window.event;
	var element = evt.target || evt.srcElement;
	var container = element.parentNode.parentNode;
	container.className = (container.className == 'collapsed') ? 'expanded' : 'collapsed';
	element.className = (element.className == 'collapser collapserCollapsed') ? 'collapser collapserExpanded' : 'collapser collapserCollapsed';
};

Dump.node = function(obj, name) {
	var type = Utils.getType(obj);
	var node, properties = [], property, count, childNode, i, typeContainer, nameContainer, valueContainer, collapserContainer, collapser;
	node = document.createElement('div');
	collapserContainer = document.createElement('div');
	collapserContainer.className = 'collapserContainer';
	node.appendChild(collapserContainer);
	typeContainer = document.createElement('span');
	typeContainer.className = 'typeContainer';
	typeContainer.appendChild(document.createTextNode(Dump.typeNames[type]));
	node.appendChild(typeContainer);
	nameContainer = document.createElement('span');
	nameContainer.className = 'nameContainer';
	nameContainer.appendChild(document.createTextNode(name));
	node.appendChild(nameContainer);
	switch(type) {
		case Utils.TYPE_ARRAY:
		case Utils.TYPE_OBJECT:
			for(property in obj) {
				properties.push(property);
			}
			count = properties.length;
			if (type == Utils.TYPE_ARRAY) {
				properties.sort(Comparator.numericAsc);
				nameContainer.appendChild(document.createTextNode('[' + count + ']'));
			} else {
				properties.sort();
			}
			valueContainer = document.createElement('ul');
			for (i = 0; i < count; i++) {
				property = properties[i];
				childNode = document.createElement('li');
				childNode.appendChild(Dump.node(obj[property], property));
				valueContainer.appendChild(childNode);
			}
			if(childNode != null) {
				childNode.className += ' last';
			}
			if(valueContainer.childNodes.length > 0) {
				collapser = document.createElement('div');
				collapser.className = 'collapser collapserCollapsed';
				collapserContainer.appendChild(collapser);
				collapser.onclick = Dump.handleCollapserClick;
				node.className = 'collapsed';
				node.appendChild(valueContainer);
			}
			break;
		case Utils.TYPE_BOOLEAN:
		case Utils.TYPE_NUMBER:
		case Utils.TYPE_NULL:
		case Utils.TYPE_UNDEFINED:
			valueContainer = document.createElement('span');
			valueContainer.className = 'valueContainer';
			valueContainer.appendChild(document.createTextNode(' = ' + obj));
			node.appendChild(valueContainer);
			break;
		default:
			valueContainer = document.createElement('span');
			valueContainer.className = 'valueContainer';
			valueContainer.appendChild(document.createTextNode(' = "' + obj + '"'));
			node.appendChild(valueContainer);
	}
	return node;
};