	var debugging = true;

	
    function assert(fact, msg) { 
    	if (!fact) {
    		if (debugging) alert("Assert failure!" + (msg)?("\n"+msg):"");
    		return false; 
    	} else
    		return true;
    }
    
    function stripHTMLTags(x) {
		x = x.replace(/</g, '&lt;');
		x = x.replace(/>/g, '&gt;');
		return x;
    }

	function d(a) {
		if (debugging) 
			if ($('debug'))
				$('debug').innerHTML = "<hr><p><pre>"+stripHTMLTags(a)+"</pre></p>" + $('debug').innerHTML ;
			else
				alert(a);
	}

	function _dO(a, deep) {
		if (!debugging) return;
//		if (!a) { d('Null'); return; };
		var s = ""; var k = "";
		s += typeof(a)+"\n";
		for (var p in a) {
			try {
				k = a[p]+"";
				if (typeof(a[p])=="function") k = k.substring(0, k.indexOf("{"));
				else if(deep && typeof(a[p])=="object") k = _dO(a[p], true);
				else if(k.length>20) k = k.substring(0, 35);
				s += p + ": " + k + "\n";
			} catch (e) {
				// do nothing!
			}
		}
		return s;
	}
	
	function dO(a) {
		if (!debugging) return;
		d(_dO(a));
	}

	function dOO(a) {
		if (!debugging) return;
		d(_dO(a, true));
	}
	
	function dXML(a) {
		return _dXML(a, ".");
	}
	
	function _dXML(el, tab) {		
		var s = "";
		if (!el) return "";
		s += tab+"name: "+el.nodeName+"\n";
		if (el.nodeName=="#text") {
			s += tab+"value: "+el.nodeValue+"\n";
		} else
			if (el.childNodes && el.childNodes.length>0) {
				s += tab+"childs:"+el.childNodes.length+"\n";
	 	      	for (var i = 0; i<el.childNodes.length; i++) {
					s += tab+"child"+i+":\n";
					s += _dXML(el.childNodes[i], tab+"  ");
	 	      	}
	 		}
 		return s;
	}
