Element.extend({
 
	selectRange: function(start, end) {
		this.focus();
 
		if(window.ie) {
			var range = this.createTextRange();
			range.collapse(true);
			range.moveStart('character', start);
			range.moveEnd('character', end - start);
			range.select();
 
			return this;
		}
 
	return this.setSelectionRange(start, end);
	},
 
	getSelectionStart: function() {
		if(window.ie) {
			this.focus();
 
			var range = document.selection.createRange();
			var tmp = range.duplicate();
			tmp.moveToElementText(this);
			tmp.setEndPoint('EndToEnd', range);
 
			return tmp.text.length - range.text.length;
		}
 
	return this.selectionStart;
	},
 
	getSelectionEnd: function() {
		if(window.ie) {
			this.focus();
 
			var range = document.selection.createRange();
			var tmp = range.duplicate();
			tmp.moveToElementText(this);
			tmp.setEndPoint('EndToEnd', range);
 
			return this.getSelectionStart() + range.text.length;
		}
 
		return this.selectionEnd;
	},
 
	getSelectedText: function() {		
		if(window.ie)
			return document.selection.createRange().text;
 
		return this.getValue().substring(this.getSelectionStart(), this.getSelectionEnd());
	},
 
	getSelectedRange: function() {
		return {
			start: this.getSelectionStart(),
			end: this.getSelectionEnd()
		}
	},
 
	setCaretPosition: function(pos) {
		if(pos == 'start')
			pos = 0;
		else if(pos == 'end')
			pos = this.getValue().length;
		return this.selectRange(pos, pos);
	},
 
	getCaretPosition: function() {
		return this.getSelectedRange().start;
	},
 
	insertAtCursor: function(value, select) {
		var start = this.getSelectionStart();
		var end = this.getSelectionEnd();
		this.value = this.getValue().substring(0, start) + value + this.getValue().substring(end, this.getValue().length);
 
		if($pick(select, true))
			this.selectRange(start, start + value.length);
		else
			this.setCaretPosition(start + value.length);
 
		return this;
	},
 
	insertAroundCursor: function(value, options, select) {
		options = $merge({
			before: '',
			after: ''
		}, $pick(options, {}));
 
		value = $pick(value, 'something here');
		var start = this.getSelectionStart();
		var end = this.getSelectionEnd();
 
		if(start == end) 
		{
			var text = this.getValue();
			this.value = text.substring(0, start) + options.before + value + options.after + text.substring(end, text.length);
			this.selectRange(start + options.before.length, end + options.before.length + value.length);
			text = null;
		}
		else 
		{
			text = this.getValue().substring(start, end);
			this.value = this.getValue().substring(0, start) + options.before + text + options.after + this.getValue().substring(end, this.getValue().length);
			var selStart = start + options.before.length;
 
			if($pick(select, true))
				this.selectRange(selStart, selStart + text.length);
			else
				this.setCaretPosition(selStart + text.length);
 
			return this;
		}	
	}
 
});