modCoord = {
	
	create: function(x, y)
	{
		x = parseInt(x);
		y = parseInt(y);
		if (isNaN(x)) x = 0;
		if (isNaN(y)) y = 0;
		return {x: x, y: y};
	},
	
	mouseAbs: function(e)
	{
		var x = 0, y = 0;
		if (!e) var e = window.event;
		if (e.pageX || e.pageY)
		{
		   x = e.pageX;
		   y = e.pageY;
		}
		else if (e.clientX || e.clientY)
		{
		   x = e.clientX + document.documentElement.scrollLeft;
		   y = e.clientY + document.documentElement.scrollTop;
		}
		return this.create(x, y);
	},
	
	mouseRel: function(e)
	{
		if (document.all)
			return this.create(window.event.offsetX, window.event.offsetY);
		return this.create(e.layerX, e.layerY);
	},
	
	boxRel: function(elem)
	{
		var	size	= modCoord.elemSize(elem);
		return {tlX: 0, tlY: 0, trX: size.x, trY: 0, blX: 0, blY: size.y, brX: size.x, brY: size.y};		
	},
	
	boxOffset: function(elem)
	{
		var	size	= modCoord.elemSize(elem);
		var	off		= modCoord.offsetTopLeft(elem);
		return {tlX: off.x, tlY: off.y, trX: off.x+size.x, trY: off.y,
				blX: off.x, blY: off.y+size.y, brX: off.x+size.x, brY: off.y+size.y};
	},

	boxOffsetAbs: function(elem)
	{
		var	size	= modCoord.elemSize(elem);
		var	off		= modCoord.offsetTopLeftAbs(elem);
		return {tlX: off.x, tlY: off.y, trX: off.x+size.x, trY: off.y,
				blX: off.x, blY: off.y+size.y, brX: off.x+size.x, brY: off.y+size.y};
	},

	width: function(elem)
	{
		return elem.offsetWidth;
	},
	
	height: function(elem)
	{
		return elem.offsetHeight;
	},

	elemSize: function(elem)
	{
		return this.create(elem.offsetWidth, elem.offsetHeight);	
	},
	
	elemTop: function(elem)
	{
		var top = parseInt(modCss.getCssStyle(elem,  'top'));
		return isNaN(top) ? 0 : top;
	},

	elemLeft: function(elem)
	{
		var left = parseInt(modCss.getCssStyle(elem,  'left'));
		return isNaN(left) ? 0 : left;
	},

	elemTopLeft: function(elem)
	{
		return this.create(modCss.getCssStyle(elem, 'left'), modCss.getCssStyle(elem,  'top'));
	},

	offsetLeft: function(elem)
	{
		return elem.offsetLeft;
	},

	offsetRight: function(elem)
	{
		return elem.offsetLeft + elem.offsetWidth;
	},

	offsetTop: function(elem)
	{
		return elem.offsetTop;
	},

	offsetBottom: function(elem)
	{
		return elem.offsetTop + elem.offsetHeight;
	},

	offsetTopLeft: function(elem)
	{
		return this.create(elem.offsetLeft, elem.offsetTop);	
	},
	
	offsetTopAbs: function(elem)
	{
		if (elem.offsetParent != null)
			return (elem.offsetTop + modCoord.offsetTopAbs(elem.offsetParent));
		return elem.offsetTop;
	},

	offsetLeftAbs: function(elem)
	{
		if (elem.offsetParent != null)
			return (elem.offsetLeft + modCoord.offsetLeftAbs(elem.offsetParent));
		return elem.offsetLeft;
	},

	offsetTopLeftAbs: function(elem)
	{
		return this.create(modCoord.offsetLeftAbs(elem), modCoord.offsetTopAbs(elem));	
	},

	plus: function(coord1, coord2)
	{
		return this.create(coord1.x + coord2.x, coord1.y + coord2.y);	
	},
	
	minus: function(coord1, coord2)
	{
		return this.create(coord1.x - coord2.x, coord1.y - coord2.y);	
	},
	
	containVerticallyUp: function(elem1, elem2)
	{
		var c1 = modCoord.boxOffset(elem1);
		var c2 = modCoord.boxOffset(elem2);
		return (c2.tlY < (c1.tlY + (c1.blY - c1.tlY) / 2) && c2.tlY > c1.tlY);
	},
	
	containVerticallyDown: function(elem1, elem2)
	{
		var c1 = modCoord.boxOffset(elem1);
		var c2 = modCoord.boxOffset(elem2);
		return (c2.blY > (c1.tlY + (c1.blY - c1.tlY) / 2) && c2.blY < c1.blY);
	},
	
	inBox: function(point, box)
	{
		return point.x > box.tlX && point.x < box.trX && point.y > box.tlY && point.y < box.blY;
	},
	
	inTopBox: function(point, box)
	{
		return point.x > box.tlX && point.x < box.trX && point.y > box.tlY && point.y < (box.tlY + (box.blY - box.tlY) / 2);
	},
	
	inBottomBox: function(point, box)
	{
		return point.x > box.tlX && point.x < box.trX && point.y < box.blY && point.y > (box.tlY + (box.blY - box.tlY) / 2);
	}
	
};