/**
 * Fix getOffsets() for IE.
 */
Element.implement({
	getOffsets: function() {
		var element = this, position = {x: 0, y: 0};
		if (isBody(this)) return position;
		while (element && !isBody(element)){
			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;
	}
});
/* Private methods required */
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;
};
