/* * Tab Override jQuery Plugin v1.0 * http://wjbryant.com/projects/tab-override/ * * Copyright (c) 2010 Bill Bryant * Licensed under the MIT license * http://opensource.org/licenses/mit-license.php */ jQuery.fn.tabOverride=(function(e){var d="\t";function c(r){var k,j,v,p,t,q,o,i,h,s,g,u,l,m,f,n;if(r.keyCode===9){k=d;j=k.length;v=this.value;i=this.scrollTop;m=0;f=0;n=0;if(typeof this.selectionStart!=="undefined"){h=this.selectionStart;s=this.selectionEnd;g=v.slice(h,s)}else{if(document.selection){p=document.selection.createRange();g=p.text;t=p.duplicate();t.moveToElementText(this);t.setEndPoint("EndToEnd",p);s=t.text.length;h=s-g.length;q=v.slice(0,h).split("\r\n").length-1;o=g.split("\r\n").length-1}else{return}}if(h!==s&&g.indexOf("\n")!==-1){if(h===0||v.charAt(h-1)==="\n"){u=h}else{u=v.lastIndexOf("\n",h-1)+1}if(s===v.length||v.charAt(s)==="\n"){l=s}else{l=v.indexOf("\n",s);if(l===-1){l=v.length}}if(r.shiftKey){if(v.slice(u).indexOf(k)===0){if(u===h){g=g.slice(j)}else{n=j}f=j}this.value=v.slice(0,u)+v.slice(u+n,h)+g.replace(new RegExp("\n"+k,"g"),function(){m+=1;return"\n"})+v.slice(s);if(p){p.collapse();p.moveEnd("character",s-f-(m*j)-o-q);p.moveStart("character",h-n-q);p.select()}else{this.selectionStart=h-n;this.selectionEnd=s-f-(m*j)}}else{m=1;this.value=v.slice(0,u)+k+v.slice(u,h)+g.replace(/\n/g,function(){m+=1;return"\n"+k})+v.slice(s);if(p){p.collapse();p.moveEnd("character",s+(m*j)-o-q);p.moveStart("character",h+j-q);p.select()}else{this.selectionStart=h+j;this.selectionEnd=s+(m*j)}}}else{if(r.shiftKey){if(v.slice(h-j).indexOf(k)===0){this.value=v.slice(0,h-j)+v.slice(h);if(p){p.move("character",h-j-q);p.select()}else{this.selectionEnd=this.selectionStart=h-j}}}else{if(p){if(v.charAt(h)==="\r"){this.value=v.slice(0,h+2)+k+v.slice(s+2);p.move("character",h+1+j-q)}else{this.value=v.slice(0,h)+k+v.slice(s);p.move("character",h+j-q)}p.select()}else{this.value=v.slice(0,h)+k+v.slice(s);this.selectionEnd=this.selectionStart=h+j}}}this.scrollTop=i;r.preventDefault()}}function a(f){if(f.keyCode===9){f.preventDefault()}}function b(f){this.each(function(){e(this).unbind(".tabOverride")});if(f||typeof f==="undefined"){this.each(function(){if(this.nodeName&&this.nodeName.toLowerCase()==="textarea"){e(this).bind("keydown.tabOverride",c).bind("keypress.tabOverride",a)}})}return e(this)}b.getTabSize=function(){return d==="\t"?0:d.length};b.setTabSize=function(g){var f;if(!g){d="\t"}else{if(typeof g==="number"&&g>0){d="";for(f=0;f