jQuery.fn.selection = function(value)
{
	var old = null;
	this.each(function(){
		var selection = $(this).getSelection();
		old = this.value.substring(selection.start, selection.end);
		if(typeof value != 'undefined'){
			this.value = this.value.substring(0, selection.start) + value + this.value.substring(selection.end);
		}
/*		if (document.selection) {
			this.focus();
			sel = document.selection.createRange();
			old = sel.text;
			if(typeof value != 'undefined'){
				sel.text = value;
			}
		} else if (this.selectionStart || this.selectionStart == '0') {
			var startPos = this.selectionStart;
			var endPos = this.selectionEnd;
			old = this.value.substring(startPos, endPos);
			if(typeof value != 'undefined'){
				this.value = this.value.substring(0, startPos) + value + this.value.substring(endPos, this.value.length);
			}
		} else if(typeof value != 'undefined'){
			this.value += value;
		}*/
	});
	return old;
};

jQuery.fn.getSelection = function(){
	if (document.selection) {
		var ret = _ieGetSelection(this.get(0));
	} else {
		var ret = _mozillaGetSelection(this.get(0));
	}
	return ret;
	
	function _mozillaGetSelection(element) {
		return { 
			start: element.selectionStart, 
			end: element.selectionEnd 
		};
	}
	
	function _ieGetSelection(element) {
		var result = {};
		if(element == document.activeElement){
			var range = document.selection.createRange();
			var bookmark = range.getBookmark();
		
			var contents = element.value;
			var originalContents = contents;
	
			var marker = _createSelectionMarker();
			while(contents.indexOf(marker) != -1) {
				marker = _createSelectionMarker();
			}
			var selection = range.text;
		
			var parent = range.parentElement();
			var originalMaxLength = parent.maxLength;
			parent.maxLength = (marker + range.text + marker).length;
	
			range.text = marker + range.text + marker;
			contents = element.value;
		
			result.start = contents.indexOf(marker);
			contents = contents.replace(marker, "");
			result.end = contents.indexOf(marker);
		
			element.value = originalContents;
			parent.maxLength = originalMaxLength;
	
			range.moveToBookmark(bookmark);
			range.select();
		}
	
		return result;
	}
	
	function _createSelectionMarker() {
		return "##SELECTION_MARKER_" + Math.random() + "##";
	}
}

jQuery.fn.setSelection = function(selection){
	if (document.selection) {
		this._ieSetSelection(selection);
	} else {
		this._mozillaSetSelection(selection);
	}
	return this;
	
}

jQuery.fn._mozillaSetSelection = function(selection) {
	this.each(function(){
		if(selection.start){
			this.selectionStart = selection.start;
		}
		if(selection.end){
			this.selectionEnd = selection.end;
		}else{
			this.selectionEnd = selection.start;
		}
	});
}

jQuery.fn._ieSetSelection = function(selection) {
	this.each(function(){
		if(this == document.activeElement){
			var range = this.createTextRange();
			range.collapse();
			if(selection.start != 'undefined'){
				range.moveStart('character', selection.start);
			}
			if(selection.end != 'undefined' && selection.end > selection.start){
				range.moveEnd('character', selection.end - selection.start);
	/*		}else{
				range.moveEnd('character', selection.start);*/
			}
			range.select();
		}
	});
}