// JavaScript Document

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);
	},
 
	selectAll: function() {
		return this.selectRange(0, this.getValue().length);
	},
 
	getSelectionStart: function() {
		this.focus();
 
		if(window.ie) {
			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() {
		this.focus();
 
		if(window.ie) {
			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() {
		this.focus();
 
		if(window.ie)
			return document.selection.createRange().text;
 
	return this.getValue().substring(this.getSelectionStart(), this.getSelectionEnd());
	},
 
	setCaretPosition: function(pos) {
		return this.selectRange(pos, pos);
	},
 
	getCaretPosition: function() {
		return {start: this.getSelectionStart(), end: this.getSelectionEnd()}
	},
 
	insertAtCursor: function(value, wrappers, select) {
		wrappers = $merge({
			before: '',
			after: ''
		}, $pick(wrappers, {}));
 
		var selectText = $pick(select, true);
		var start = this.getSelectionStart() + wrappers.before.length;
		var end = this.getSelectionEnd() - wrappers.after.length;
		var text = wrappers.before + value + wrappers.after;
		this.value = this.getValue().substring(0, start) + text + this.getValue().substring(end, this.getValue().length);
 
		if(selectText)
			this.selectRange(start, start + value.length);
 
	return this;	
	}
 
});