(function(){
	Element.implement({
		getOffsets: function(){
			var element = this, position = {x: 0, y: 0};
			if (isBody(this)) return position;
	
			while (element && !isBody(this)){
				position.x += element.offsetLeft;
				position.y += element.offsetTop;
	
				if (Browser.Engine.gecko){
					if (!borderBox(element)){
						position.x += leftBorder(element);
						position.y += topBorder(element);
					}
					var parent = element.parentNode;
					if (parent && styleString(parent, 'overflow') != 'visible'){
						position.x += leftBorder(parent);
						position.y += topBorder(parent);
					}
				} else if (element != this && (Browser.Engine.trident || Browser.Engine.webkit)){
					position.x += leftBorder(element);
					position.y += topBorder(element);
				}
	
				element = element.offsetParent;
				if (Browser.Engine.trident){
					while (element && !element.currentStyle.hasLayout) element = element.offsetParent;
				}
			}
			if (Browser.Engine.gecko && !borderBox(this)){
				position.x -= leftBorder(this);
				position.y -= topBorder(this);
			}
			return position;
		}
	
	});
	
	var styleString = Element.getComputedStyle;
	
	function styleNumber(element, style){
		return styleString(element, style).toInt() || 0;
	};
	
	function borderBox(element){
		return styleString(element, '-moz-box-sizing') == 'border-box';
	};
	
	function topBorder(element){
		return styleNumber(element, 'border-top-width');
	};
	
	function leftBorder(element){
		return styleNumber(element, 'border-left-width');
	};
	
	function isBody(element){
		return (/^(?:body|html)$/i).test(element.tagName);
	};
	
	function getCompatElement(element){
		var doc = element.getDocument();
		return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
	};
})();