mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	It's not really a part of the server (aka the rest of zephyr/). (imported from commit 27f6b6b064938ad927075a68d873e4b68710d279)
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						||
 *
 | 
						||
 * Copyright (c) 2010 C. F., Wong (<a href="http://cloudgen.w0ng.hk">Cloudgen Examplet Store</a>)
 | 
						||
 * Licensed under the MIT License:
 | 
						||
 * http://www.opensource.org/licenses/mit-license.php
 | 
						||
 *
 | 
						||
 */
 | 
						||
(function($,len,createRange,duplicate){
 | 
						||
	$.fn.caret=function(options,opt2){
 | 
						||
		var start,end,t=this[0],browser=$.browser.msie;
 | 
						||
		if(typeof options==="object" && typeof options.start==="number" && typeof options.end==="number") {
 | 
						||
			start=options.start;
 | 
						||
			end=options.end;
 | 
						||
		} else if(typeof options==="number" && typeof opt2==="number"){
 | 
						||
			start=options;
 | 
						||
			end=opt2;
 | 
						||
		} else if(typeof options==="string"){
 | 
						||
			if((start=t.value.indexOf(options))>-1) end=start+options[len];
 | 
						||
			else start=null;
 | 
						||
		} else if(Object.prototype.toString.call(options)==="[object RegExp]"){
 | 
						||
			var re=options.exec(t.value);
 | 
						||
			if(re != null) {
 | 
						||
				start=re.index;
 | 
						||
				end=start+re[0][len];
 | 
						||
			}
 | 
						||
		}
 | 
						||
		if(typeof start!="undefined"){
 | 
						||
			if(browser){
 | 
						||
				var selRange = this[0].createTextRange();
 | 
						||
				selRange.collapse(true);
 | 
						||
				selRange.moveStart('character', start);
 | 
						||
				selRange.moveEnd('character', end-start);
 | 
						||
				selRange.select();
 | 
						||
			} else {
 | 
						||
				this[0].selectionStart=start;
 | 
						||
				this[0].selectionEnd=end;
 | 
						||
			}
 | 
						||
			this[0].focus();
 | 
						||
			return this
 | 
						||
		} else {
 | 
						||
			// Modification as suggested by Андрей Юткин
 | 
						||
           if(browser){
 | 
						||
				var selection=document.selection;
 | 
						||
                if (this[0].tagName.toLowerCase() != "textarea") {
 | 
						||
                    var val = this.val(),
 | 
						||
                    range = selection[createRange]()[duplicate]();
 | 
						||
                    range.moveEnd("character", val[len]);
 | 
						||
                    var s = (range.text == "" ? val[len]:val.lastIndexOf(range.text));
 | 
						||
                    range = selection[createRange]()[duplicate]();
 | 
						||
                    range.moveStart("character", -val[len]);
 | 
						||
                    var e = range.text[len];
 | 
						||
                } else {
 | 
						||
                    var range = selection[createRange](),
 | 
						||
                    stored_range = range[duplicate]();
 | 
						||
                    stored_range.moveToElementText(this[0]);
 | 
						||
                    stored_range.setEndPoint('EndToEnd', range);
 | 
						||
                    var s = stored_range.text[len] - range.text[len],
 | 
						||
                    e = s + range.text[len]
 | 
						||
                }
 | 
						||
			// End of Modification
 | 
						||
            } else {
 | 
						||
				var s=t.selectionStart,
 | 
						||
					e=t.selectionEnd;
 | 
						||
			}
 | 
						||
			var te=t.value.substring(s,e);
 | 
						||
			return {start:s,end:e,text:te,replace:function(st){
 | 
						||
				return t.value.substring(0,s)+st+t.value.substring(e,t.value[len])
 | 
						||
			}}
 | 
						||
		}
 | 
						||
	}
 | 
						||
})(jQuery,"length","createRange","duplicate"); |