docs: function triggerEdge( that ) {
  		that.debug.groupStart( 'triggerEdge' ); // %REMOVE_LINE%
  
  		var mouse = that.mouse,
  			view = that.view,
  			triggerOffset = that.triggerOffset;
  
  		// Get the ascendant trigger basing on elementFromMouse.
  		var element = getAscendantTrigger( that );
  
  		that.debug.logElements( [ element ], [ 'Ascendant trigger' ], 'First stage' ); // %REMOVE_LINE%
  
  		// Abort if there's no appropriate element.
  		if ( !element ) {
  			that.debug.logEnd( 'ABORT. No element, element is editable or element contains editable.' ); // %REMOVE_LINE%
  			return null;
  		}
  
  		// Dimensions will be necessary.
  		updateSize( that, element );
  
  		// If triggerOffset is larger than a half of element's height,
  		// use an offset of 1/2 of element's height. If the offset wasn't reduced,
  		// top area would cover most (all) cases.
  		var fixedOffset = Math.min( triggerOffset,
  				0 | ( element.size.outerHeight / 2 ) ),
  
  		// This variable will hold the trigger to be returned.
  			triggerSetup = [],
  			triggerLook,
  
  		// This flag determines whether dealing with a bottom trigger.
  			bottomTrigger;
  
  		//	\-> Top trigger.
  		if ( inBetween( mouse.y, element.size.top - 1, element.size.top + fixedOffset ) )
  			bottomTrigger = false;
  		//	\-> Bottom trigger.
  		else if ( inBetween( mouse.y, element.size.bottom - fixedOffset, element.size.bottom + 1 ) )
  			bottomTrigger = true;
  		//	\-> Abort. Not in a valid trigger space.
  		else {
  			that.debug.logEnd( 'ABORT. Not around of any edge.' ); // %REMOVE_LINE%
  			return null;
  		}
  
  		// Reject wrong elements.
  		// 	\-> Reject an element which is a flow breaker.
  		// 	\-> Reject an element which has a child above/below the mouse pointer.
  		//	\-> Reject an element which belongs to list items.
  		if ( isFlowBreaker( element ) ||
  			isChildBetweenPointerAndEdge( that, element, bottomTrigger ) ||
  			element.getParent().is( DTD_LISTITEM ) ) {
  				that.debug.logEnd( 'ABORT. element is wrong', element ); // %REMOVE_LINE%
  				return null;
  		}
  
  		// Get sibling according to bottomTrigger.
  		var elementSibling = getNonEmptyNeighbour( that, element, !bottomTrigger );
  
  		// No sibling element.
  		// This is a first or last child case.
  		if ( !elementSibling ) {
  			// No need to reject the element as it has already been done before.
  			// Prepare a trigger.
  
  			// Determine trigger look.
  			if ( element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ) {
  				updateEditableSize( that );
  
  				if ( bottomTrigger && inBetween( mouse.y,
  					element.size.bottom - fixedOffset, view.pane.height ) &&
  					inBetween( element.size.bottom, view.pane.height - fixedOffset, view.pane.height ) ) {
  						triggerLook = LOOK_BOTTOM;
  				}
  				else if ( inBetween( mouse.y, 0, element.size.top + fixedOffset ) )
  					triggerLook = LOOK_TOP;
  
  			}
  			else
  				triggerLook = LOOK_NORMAL;
  
  			triggerSetup = [ null, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [
  					bottomTrigger ? EDGE_BOTTOM : EDGE_TOP,
  					TYPE_EDGE,
  					triggerLook,
  					element.equals( that.editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( that.isRelevant ) ) ?
  						( bottomTrigger ? LOOK_BOTTOM : LOOK_TOP ) : LOOK_NORMAL
  				] );
  
  			that.debug.log( 'Configured edge trigger of ' + ( bottomTrigger ? 'EDGE_BOTTOM' : 'EDGE_TOP' ) ); // %REMOVE_LINE%
  		}
  
  		// Abort. Sibling is a text element.
  		else if ( isTextNode( elementSibling ) ) {
  			that.debug.logEnd( 'ABORT. Sibling is non-empty text element' ); // %REMOVE_LINE%
  			return null;
  		}
  
  		// Check if the sibling is a HTML element.
  		// If so, create an TYPE_EDGE, EDGE_MIDDLE trigger.
  		else if ( isHtml( elementSibling ) ) {
  			// Reject wrong elementSiblings.
  			// 	\-> Reject an elementSibling which is a flow breaker.
  			//	\-> Reject an elementSibling which isn't a trigger.
  			//	\-> Reject an elementSibling which belongs to list items.
  			if ( isFlowBreaker( elementSibling ) ||
  				!isTrigger( that, elementSibling ) ||
  				elementSibling.getParent().is( DTD_LISTITEM ) ) {
  					that.debug.logEnd( 'ABORT. elementSibling is wrong', elementSibling ); // %REMOVE_LINE%
  					return null;
  			}
  
  			// Prepare a trigger.
  			triggerSetup = [ elementSibling, element ][ bottomTrigger ? 'reverse' : 'concat' ]().concat( [
  					EDGE_MIDDLE,
  					TYPE_EDGE
  				] );
  
  			that.debug.log( 'Configured edge trigger of EDGE_MIDDLE' ); // %REMOVE_LINE%
  		}
  
  		if ( 0 in triggerSetup ) {
  			that.debug.logEnd( 'SUCCESS. Returning a trigger.' ); // %REMOVE_LINE%
  			return new boxTrigger( triggerSetup );
  		}
  
  		that.debug.logEnd( 'ABORT. No trigger generated.' ); // %REMOVE_LINE%
  		return null;
  	}