text: // insert characters in a textarea or text input field
  // special characters are enclosed in {}; use {{} for the { character itself
  // documentation: http://bililite.com/blog/2008/08/20/the-fnsendkeys-plugin/
  // source: https://github.com/dwachss/bililiteRange/blob/master/jquery.sendkeys.js
  // Version: 4
  // Copyright (c) 2013 Daniel Wachsstock
  // MIT license:
  // Permission is hereby granted, free of charge, to any person
  // obtaining a copy of this software and associated documentation
  // files (the "Software"), to deal in the Software without
  // restriction, including without limitation the rights to use,
  // copy, modify, merge, publish, distribute, sublicense, and/or sell
  // copies of the Software, and to permit persons to whom the
  // Software is furnished to do so, subject to the following
  // conditions:
  
  // The above copyright notice and this permission notice shall be
  // included in all copies or substantial portions of the Software.
  
  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  // OTHER DEALINGS IN THE SOFTWARE.
  
  (function($){
  
  $.fn.sendkeys = function (x){
  	x = x.replace(/([^{])\n/g, '$1{enter}'); // turn line feeds into explicit break insertions, but not if escaped
  	return this.each( function(){
  		bililiteRange(this).bounds('selection').sendkeys(x).select();
  		this.focus();
  	});
  }; // sendkeys
  
  // add a default handler for keydowns so that we can send keystrokes, even though code-generated events
  // are untrusted (http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events)
  // documentation of special event handlers is at http://learn.jquery.com/events/event-extensions/
  $.event.special.keydown = $.event.special.keydown || {};
  $.event.special.keydown._default = function (evt){
  	if (evt.isTrusted) return false;
  	if (evt.ctrlKey || evt.altKey || evt.metaKey) return false; // only deal with printable characters. This may be a false assumption
  	if (evt.key == null) return false; // nothing to print. Use the keymap plugin to set this
  	var target = evt.target;
  	if (target.isContentEditable || target.nodeName == 'INPUT' || target.nodeName == 'TEXTAREA') {
  		// only insert into editable elements
  		var key = evt.key;
  		if (key.length > 1 && key.charAt(0) != '{') key = '{'+key+'}'; // sendkeys notation
  		$(target).sendkeys(key);
  		return true;
  	}
  	return false;
  }
  })(jQuery)
  