docs: function( element, isMoveToEnd ) {
  			// We don't want to modify original range if there's no editable position.
  			var range = new CKEDITOR.dom.range( this.root ),
  				found = 0,
  				sibling,
  				positions = [ CKEDITOR.POSITION_AFTER_END, CKEDITOR.POSITION_BEFORE_START ];
  
  			// Set collapsed range at one of ends of element.
  			range.moveToPosition( element, positions[ isMoveToEnd ? 0 : 1 ] );
  
  			// Start element isn't a block, so we can automatically place range
  			// next to it.
  			if ( !element.is( CKEDITOR.dtd.$block ) )
  				found = 1;
  			else {
  				// Look for first node that fulfills eval function and place range next to it.
  				sibling = range[ isMoveToEnd ? 'getNextEditableNode' : 'getPreviousEditableNode' ]();
  				if ( sibling ) {
  					found = 1;
  
  					// Special case - eval accepts block element only if it's a non-editable block,
  					// which we want to select, not place collapsed selection next to it (which browsers
  					// can't handle).
  					if ( sibling.type == CKEDITOR.NODE_ELEMENT && sibling.is( CKEDITOR.dtd.$block ) && sibling.getAttribute( 'contenteditable' ) == 'false' ) {
  						range.setStartAt( sibling, CKEDITOR.POSITION_BEFORE_START );
  						range.setEndAt( sibling, CKEDITOR.POSITION_AFTER_END );
  					} else {
  						range.moveToPosition( sibling, positions[ isMoveToEnd ? 1 : 0 ] );
  					}
  				}
  			}
  
  			if ( found )
  				this.moveToRange( range );
  
  			return !!found;
  		}