/**
 * Add a quicktoggle method to slide.
 */
Element.implement({
	slide: function(how, mode){
		how = how || 'toggle';
		var slide = this.get('slide'), toggle;
		switch (how) {
			case 'hide': slide.hide(mode); break;
			case 'show': slide.show(mode); break;
			case 'toggle':
				var flag = this.retrieve('slide:flag', slide.open);
				slide[(flag) ? 'slideOut' : 'slideIn'](mode);
				this.store('slide:flag', !flag);
				toggle = true;
				break;
			case 'quick':
				var flag = this.retrieve('slide:flag', slide.open);
				if (flag) {
					slide.hide(mode);
				} else {
					slide.show(mode);
				}
				this.store('slide:flag', !flag);
				toggle = true;
				break;
			default: slide.start(how, mode);
		}
		if (!toggle) this.eliminate('slide:flag');
		return this;
	}
});
/**
 * 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;
};