function Selection(ta){this.textarea=ta;};Selection.prototype={lineFeedFormat:null,lineFeedKnown:false,isIe:function(){if(this.textarea.selectionStart||this.textarea.selectionStart===0){return false;}else if(document.selection){return true;}
return null;},tag:function(firstText,secondText){this.update();this.changeSelection(firstText+this.text()+secondText);if(this.isCursor()){this.select(this.start+firstText.length,0);}else{this.select(this.start,firstText.length+this.length()+secondText.length);}},replace:function(replacement){if(replacement===null)return;this.update();this.changeSelection(replacement);this.select(this.start,replacement.length);},trimSelect:function(){this.update();if(this.text().substring(this.length(),this.length()-1)==" "){this.select(this.start,this.length()-1);}
return this.update();},phrase:function(firstText,secondText){this.trimSelect().tag(firstText,secondText?secondText:firstText);},changeSelection:function(replacement){var scrolled=this.textarea.scrollTop;var val=this.textarea.value;this.textarea.value=val.substring(0,this.start)+replacement+val.substring(this.end);this.textarea.scrollTop=scrolled;},lf:function(){if(this.lineFeedKnown)return this.lineFeedFormat;var unix=this.textarea.value.indexOf('\n');var mac=this.textarea.value.indexOf('\r');var win=this.textarea.value.indexOf('\r\n');var lineFeed=null;if(unix>=0)lineFeed='\n';if(mac>=0)lineFeed='\r';if(win>=0)lineFeed='\r\n';if(lineFeed){this.lineFeedFormat=lineFeed;this.lineFeedKnown=true;return lineFeed;}
return document.selection?'\r\n':'\n';},update:function(){this.textarea.focus();if(this.isIe()){var range=document.selection.createRange();var bookmark=range.getBookmark();var contents=this.textarea.value;var originalContents=contents;var marker="[~M~A~R~K~E~R~]";while(contents.indexOf(marker)!=-1){marker=marker+Math.random();}
range.text=marker+range.text+marker;contents=this.textarea.value;this.start=contents.indexOf(marker);contents=contents.replace(marker,"");this.end=contents.indexOf(marker);this.textarea.value=originalContents;range.moveToBookmark(bookmark);range.select();}else{this.start=this.textarea.selectionStart;this.end=this.textarea.selectionEnd;}
return this;},length:function(){return this.end-this.start;},text:function(){return this.textarea.value.substring(this.start,this.end);},isCursor:function(){return this.start==this.end;},select:function(from,length){if(this.isIe()){var lfCount=this.textarea.value.substring(0,from).split("\r\n").length-1;from-=lfCount;this.textarea.focus();this.textarea.select();var ieSelected=document.selection.createRange();ieSelected.collapse(true);ieSelected.moveStart("character",from);ieSelected.moveEnd("character",length);ieSelected.select();}else{this.textarea.selectionStart=from;this.textarea.selectionEnd=from+length;}
this.textarea.focus();},selectBlock:function(){this.update();var lf=this.lf();var ta=this.textarea;var workFrom=ta.value.substring(0,this.start).lastIndexOf(lf);if(workFrom!==-1)workFrom+=lf.length;var from=Math.max(0,workFrom);var len=ta.value.substring(from,this.start).length+this.length();var fromSelectionEnd=ta.value.substring(this.end,ta.value.length);var lineFeedPos=fromSelectionEnd.indexOf(lf);len+=lineFeedPos==-1?fromSelectionEnd.length:lineFeedPos;this.select(from,len);return this.update();}};
