Element.extend({
 
	injectFragment: function(fragment, where){
		if (this.insertAdjacentHTML){
			try {
				this.insertAdjacentHTML(where, fragment);
			} 
			catch (e) {
				var tagName = this.tagName.toLowerCase();
 
				if (tagName === 'table' || tagName === 'tbody' || tagName === 'tr'){
					var div = document.createElement('div');
 
					div.innerHTML = '<table><tbody><tr>' + fragment + '</tr></tbody></table>';
					fragments = $A(div.childNodes[0].childNodes[0].childNodes[0].childNodes);
 
					if (fragments[0] == undefined){
						div.innerHTML = '<table><tbody>' + fragment + '</tbody></table>';
						fragments = $A(div.childNodes[0].childNodes[0].childNodes);
 
						if (fragments[0] == undefined){
							div.innerHTML = '<table>' + fragment + '</table>';
							fragments = $A(div.childNodes[0].childNodes);
						}
					}	
 
					switch (where){
						case 'BeforeBegin':
							fragments.each(function(f){ this.parentNode.insertBefore(f, this) }, this);
							break;
						case 'AfterBegin':
							fragments.reverse();
							fragments.each(function(f){ this.insertBefore(f, this.firstChild) }, this);
							break;
						case 'BeforeEnd':
							fragments.each( function(f){ this.appendChild(f) }, this);
							break;
						case 'AfterEnd':
							fragments.reverse();
							fragments.each( function(f){ this.parentNode.insertBefore(f, this.nextSibling) }, this);
					}
				} else {
					throw e;	
				}
			}
		} else {
			var range = this.ownerDocument.createRange();
 
			switch (where){
				case 'BeforeBegin':
					range.setStartBefore(this);
					fragment = range.createContextualFragment(fragment);
					this.parentNode.insertBefore(fragment, this);
					break;
				case 'AfterBegin':
					range.selectNodeContents(this);
					range.collapse(true);
					fragment = range.createContextualFragment(fragment);
					this.insertBefore(fragment, this.firstChild);
					break;
				case 'BeforeEnd':
					range.selectNodeContents(this);
					range.collapse(this);
					fragment = range.createContextualFragment(fragment);
					this.appendChild(fragment);
					break;
				case 'AfterEnd':
					range.setStartAfter(this);
					fragment = range.createContextualFragment(fragment);
					this.parentNode.insertBefore(fragment, this.nextSibling);
			}
		}
 
		return this;
	},
 
	injectFragmentBefore: function(fragment){
		return this.injectFragment(fragment, 'BeforeBegin');
	},
 
	injectFragmentTop: function(fragment){
		return this.injectFragment(fragment, 'AfterBegin');
	},
 
	injectFragmentBottom: function(fragment){
		return this.injectFragment(fragment, 'BeforeEnd');
	},
 
	injectFragmentAfter: function(fragment){
		return this.injectFragment(fragment, 'AfterEnd');
	}
 
});