function jt_ShowNoneElm(elm, showIt, showStyle) {
	if (elm) {elm.style.display = showIt ? (showStyle ? showStyle : 'block') : "none";}
}

function jt_ShowNone(divName, showIt, showStyle) {
	jt_ShowNoneElm(document.getElementById(divName), showIt, showStyle);
}

function jt_valPx(pixels) {
	return isNaN(pixels) ? 0 : pixels + "px";
}

function jt_moveTo(obj, x, y) {
	obj.style.left = jt_valPx(x);
	obj.style.top = jt_valPx(y);
}

function jt_Point(x, y) {
	// returns a "Point" object with '.x' and '.y' properties
	this.x = x;
	this.y = y;
}

function jt_getOffsetXY(obj, findID, point) {
	// returns 'jt_Point' object with '.x' and '.y' offsets of 'obj' relative to page
	// or relative to optional 'findID', if 'findID' is found as a parent
	if (point) { // optional 'point' is re-used when valid; good practice when dragging
		point.x = obj.offsetLeft;
		point.y = obj.offsetTop;
	}
	else {point = new jt_Point(obj.offsetLeft, obj.offsetTop);}
	var parent = obj.offsetParent;
	while (parent !== null) {
		if (findID && (parent.id == findID)) break;
		point.x += parent.offsetLeft;
		point.y += parent.offsetTop;
		parent = parent.offsetParent;
	}
	return point;
}

function msgOn(node, id, xOffset, yOffset) {
	var p = jt_getOffsetXY(node);
	var msgDIV = document.getElementById(id);
	document.body.appendChild(msgDIV);
	jt_moveTo(msgDIV, p.x + xOffset, p.y + yOffset);
	jt_ShowNoneElm(msgDIV, true);
}

