function recurseVars(v)
{
	var txt = "";
	switch (typeof(v))
	{
		case "boolean": return "[bool]"+(v?'yes':'no');
		case "string": return "[string]"+v;
		case "number": return "[number]"+v;
		case "undefined": return "[undefined]";
		case "function": return "[function]"+v;
		case "object":
		    txt += "[object]\n";
			for (var item in v)
			{
				txt += "  propertyname="+item+ " value="+v[item]+"\n";
			}
			return txt;
	}
}
function log(hint,msg) {
	
	if (window.console)
	{
		window.console.log(hint+":\n"+recurseVars(msg));
	}
	else
	{
	//	alert(hint+":\n"+recurseVars(msg));
	}
	return msg;
}

function viewport() {
	var e = document.documentElement || {},
		b = document.body || {},
		w = window;

	return {
		x: w.pageXOffset || e.scrollLeft || b.scrollLeft || 0,
		y: w.pageYOffset || e.scrollTop || b.scrollTop || 0,
		cx: min( e.clientWidth, b.clientWidth, w.innerWidth ),
		cy: min( e.clientHeight, b.clientHeight, w.innerHeight )
	};

	function min() {
		var v = Infinity;
		for( var i = 0;  i < arguments.length;  i++ ) {
			var n = arguments[i];
			if( n && n < v ) v = n;
		}
		return v;
	}
}


