var e_max_level=-1;

function e(obj, ml) {
	if (!document.getElementById('debug'))
	{
		debug_init()
	}
	if (ml || ml==0)
	{
		e_max_level = ml;
	}
	var s = e_level(obj, 0);
	var debug = document.getElementById('debug');
	debug.innerHTML = '<pre style="border: 1px solid black; padding: 2px;">'+ s +'</pre>' + debug.innerHTML ;
}

var e_path = Array(); // avoids recursion

function e_level(obj, level) {
	//if (!confirm(obj + ' - ' + level + ' - ' + e_path.length + ' - ' + e_max_level)) return;
	if (e_max_level!=-1 && level>=e_max_level) return;
	e_path[level] = obj;
	var s = '';
	var tab = '\t';
	var nl = '\n';
	var indent = '';
	for (i = 0; i < level; i++) {
		indent += tab;
	}
	if (typeof obj == 'string' && obj.indexOf('\n') > -1) {
		return '['+ typeof obj +'] :<br/><div style="border: 1px dotted black; padding: 2px">'
			+ obj.replace(/</g, '&lt;').replace(/>/g, '&gt;') +'</div>'+ nl;
				
	} else if (typeof obj == 'string' || typeof obj == 'number') {	
		return '['+ typeof obj +'] '+ obj + nl;

	} else if (typeof obj == 'function') {	
		return '[function]'+ nl;
	
	} else if (typeof obj == 'object') {
		try {
			for (var x in obj) {
				var rec = false;
				for (i = level - 1; i >= 0; i--) {
					if (obj[x] && e_path[i] == obj[x]) {
						s += indent + tab + x +': [Recursion]' + nl;
						rec = true;
						break;
					}
							
				}
		
				if (!rec) {
					if (typeof obj[x] == 'object') {
						if (obj[x] && obj[x].nodeName) { 
							s += indent + tab + x +': [DOM element]'+ nl;
						} else {
							s += indent + tab + x +': '+ e_level(obj[x], level + 1);
						}
					} else if (typeof obj[x] == 'function') {
						s += indent + tab + x +': [function]'+ nl;
					} else if (typeof obj[x] == 'string' && (obj[x].indexOf('\n') > -1 || obj[x].indexOf('<') > -1)) {
						s += indent + tab + x +':<br/><div style="border: 1px dotted black; padding: 2px">'
							+ obj[x].replace(/</g, '&lt;').replace(/>/g, '&gt;') +'</div>'+ nl;
					} else  {
						s += indent + tab + x +': '+ obj[x] + nl;
					}
				}
			}
		} catch (evt) {
			return '(Exeption: '+ evt.message +')'+ nl;
			
		}
	}
	if (s == '') return '['+ typeof obj +'] null' + nl;
	else return '['+ typeof obj +']' + nl + indent +'{'+ nl + s + indent +'}'+ nl;
}

function debug_init()
{
	document.body.innerHTML+='<div id="debug" style="position: absolute; bottom: 0px; right: 0px; width: 300px; height: 300px; overflow: auto; background-color: yellow">&nbsp;</div>';
}

