function fnHandleInteraction (bEnabled) {
		if (bEnabled) {
			var oParentDOM = this.$parent.get(0);

			if (oParentDOM){
				// Those two elements handle the tab chain so it is not possible to tab behind the busy section.
				this.fnRedirectFocus = redirectFocus.bind(this);
				this.oTabbableBefore = createTabbable(this.fnRedirectFocus);
				this.oTabbableAfter = createTabbable(this.fnRedirectFocus);

				oParentDOM.parentNode.insertBefore(this.oTabbableBefore, oParentDOM);
				oParentDOM.parentNode.insertBefore(this.oTabbableAfter, oParentDOM.nextSibling);

				this._fnSuppressDefaultAndStopPropagationHandler = suppressDefaultAndStopPropagation.bind(this);

				this._aSuppressHandler = registerInteractionHandler.call(this, this._fnSuppressDefaultAndStopPropagationHandler);
			} else {
				Log.warning("fnHandleInteraction called with bEnabled true, but no DOMRef exists!");
			}
		} else {
			if (this.oTabbableBefore) {
				removeTabbable(this.oTabbableBefore, this.fnRedirectFocus);
				delete this.oTabbableBefore;
			}
			if (this.oTabbableAfter) {
				removeTabbable(this.oTabbableAfter, this.fnRedirectFocus);
				delete this.oTabbableAfter;
			}
			delete this.fnRedirectFocus;
			//trigger handler deregistration needs to be done even if DomRef is already destroyed
			deregisterInteractionHandler.call(this, this._fnSuppressDefaultAndStopPropagationHandler);
		}

		/**
		 * Handler which suppresses event bubbling for blocked section
		 *
		 * @param {object} oEvent The event on the suppressed DOM
		 * @private
		 */
		function suppressDefaultAndStopPropagation(oEvent) {
			var bTargetIsBlockLayer = oEvent.target === this.$blockLayer.get(0),
				oTabbable;

			if (bTargetIsBlockLayer && oEvent.type === 'keydown' && oEvent.keyCode === 9) {
				// Special handling for "tab" keydown: redirect to next element before or after busy section
				Log.debug("Local Busy Indicator Event keydown handled: " + oEvent.type);
				oTabbable = oEvent.shiftKey ? this.oTabbableBefore : this.oTabbableAfter;
				oTabbable.setAttribute("tabindex", -1);
				// ignore execution of focus handler
				this.bIgnoreFocus = true;
				oTabbable.focus();
				this.bIgnoreFocus = false;
				oTabbable.setAttribute("tabindex", 0);
				oEvent.stopImmediatePropagation();

			} else if (bTargetIsBlockLayer && (oEvent.type === 'mousedown' || oEvent.type === 'touchstart')) {
				// Do not "preventDefault" to allow to focus busy indicator
				Log.debug("Local Busy Indicator click handled on busy area: " + oEvent.target.id);
				oEvent.stopImmediatePropagation();

			} else {
				Log.debug("Local Busy Indicator Event Suppressed: " + oEvent.type);
				oEvent.preventDefault();
				oEvent.stopImmediatePropagation();
			}
		}

		/**
		 * Captures and redirects focus before it reaches blocked section (from both sides)
		 *
		 * @private
		 */
		function redirectFocus() {
			if (!this.bIgnoreFocus) {
				// Redirect focus onto busy indicator (if not already focused)
				this.$blockLayer.get(0).focus();
			}
		}

		/**
		 * Create a tabbable span for the block section of the control with according focus handling.
		 *
		 * @param {function} fnRedirectFocus Focus handling function
		 * @returns {object} The span element's DOM node
		 * @private
		 */
		function createTabbable(fnRedirectFocus) {
			var oBlockSpan = document.createElement("span");

			oBlockSpan.setAttribute("tabindex", 0);
			oBlockSpan.classList.add("sapUiBlockLayerTabbable");
			oBlockSpan.addEventListener('focusin', fnRedirectFocus);

			return oBlockSpan;
		}

		/**
		 * Create a tabbable span for the block section of the control with according focus handling.
		 *
		 * @param {object} oBlockSpan The span element's DOM node
		 * @param {function} fnRedirectFocus Focus handling function
		 * @private
		 */
		function removeTabbable(oBlockSpan, fnRedirectFocus) {
			if (oBlockSpan.parentNode) {
				oBlockSpan.parentNode.removeChild(oBlockSpan);
			}
			oBlockSpan.removeEventListener('focusin', fnRedirectFocus);
		}

		/**
		 * Register event handler to suppress event within busy section
		 *
		 * @param {function} fnHandler The handler function
		 * @returns {function[]} The suppress handlers
		 */
		function registerInteractionHandler(fnHandler) {
			var aSuppressHandler = [],
				oParentDOM = this.$parent.get(0),
				oBlockLayerDOM = this.$blockLayer.get(0);

			for (var i = 0; i < aPreventedEvents.length; i++) {
				// Add event listeners with "useCapture" settings to suppress events before dispatching/bubbling starts
				oParentDOM.addEventListener(aPreventedEvents[i], fnHandler, {
					capture: true,
					passive: false
				});
				aSuppressHandler.push(EventTriggerHook.suppress(aPreventedEvents[i], oParentDOM, oBlockLayerDOM));
			}
			//for jQuery triggered events we also need the keydown handler
			this.$blockLayer.on('keydown', fnHandler);

			return aSuppressHandler;
		}

		/**
		 * Deregister event handler to suppress event within busy section
		 *
		 * @param {function} fnHandler The handler function
		 */
		function deregisterInteractionHandler(fnHandler) {
			var i,
				oParentDOM = this.$parent.get(0),
				oBlockLayerDOM = this.$blockLayer.get(0);

			if (oParentDOM) {
				for (i = 0; i < aPreventedEvents.length; i++) {
				// Remove event listeners with "useCapture" settings
					oParentDOM.removeEventListener(aPreventedEvents[i], fnHandler, {
						capture: true,
						passive: false
					});
				}
			}
			if (this._aSuppressHandler) {
				for (i = 0; i < this._aSuppressHandler.length; i++) {
					// this part should be done even no DOMRef exists
					EventTriggerHook.release(this._aSuppressHandler[i]);
				}
			}
			if (oBlockLayerDOM) {
				this.$blockLayer.off('keydown', fnHandler);
			}
		}
	}
/**
	 * Suppress interactions on all DOM elements in the blocked section.
	 *
	 * Starting with the fnHandleInteraction call, all following function calls are bound in the context of the block-state object.
	 * Meaning "this" will always reference the block-state object.
	 *
	 * @param {boolean} bEnabled New blocked state
	 * @private
	 */
Suppress interactions on all DOM elements in the blocked section.
Starting with the fnHandleInteraction call, all following function calls are bound in the context of the block-state object.
Meaning "this" will always reference the block-state object.

@param {boolean} bEnabled New blocked state
@private
Suppress interactions on all DOM elements in the blocked section . Starting with the fnHandleInteraction call all following function calls are bound in the context of the block - state object . Meaning " this " will always reference the block - state object . @param { boolean } bEnabled New blocked state @private
function fnHandleInteraction (bEnabled) {
		if (bEnabled) {
			var oParentDOM = this.$parent.get(0);
			if (oParentDOM){
				this.fnRedirectFocus = redirectFocus.bind(this);
				this.oTabbableBefore = createTabbable(this.fnRedirectFocus);
				this.oTabbableAfter = createTabbable(this.fnRedirectFocus);
				oParentDOM.parentNode.insertBefore(this.oTabbableBefore, oParentDOM);
				oParentDOM.parentNode.insertBefore(this.oTabbableAfter, oParentDOM.nextSibling);
				this._fnSuppressDefaultAndStopPropagationHandler = suppressDefaultAndStopPropagation.bind(this);
				this._aSuppressHandler = registerInteractionHandler.call(this, this._fnSuppressDefaultAndStopPropagationHandler);
			} else {
				Log.warning("fnHandleInteraction called with bEnabled true, but no DOMRef exists!");
			}
		} else {
			if (this.oTabbableBefore) {
				removeTabbable(this.oTabbableBefore, this.fnRedirectFocus);
				delete this.oTabbableBefore;
			}
			if (this.oTabbableAfter) {
				removeTabbable(this.oTabbableAfter, this.fnRedirectFocus);
				delete this.oTabbableAfter;
			}
			delete this.fnRedirectFocus;
			deregisterInteractionHandler.call(this, this._fnSuppressDefaultAndStopPropagationHandler);
		}
		function suppressDefaultAndStopPropagation(oEvent) {
			var bTargetIsBlockLayer = oEvent.target === this.$blockLayer.get(0),
				oTabbable;
			if (bTargetIsBlockLayer && oEvent.type === 'keydown' && oEvent.keyCode === 9) {
				Log.debug("Local Busy Indicator Event keydown handled: " + oEvent.type);
				oTabbable = oEvent.shiftKey ? this.oTabbableBefore : this.oTabbableAfter;
				oTabbable.setAttribute("tabindex", -1);
				this.bIgnoreFocus = true;
				oTabbable.focus();
				this.bIgnoreFocus = false;
				oTabbable.setAttribute("tabindex", 0);
				oEvent.stopImmediatePropagation();
			} else if (bTargetIsBlockLayer && (oEvent.type === 'mousedown' || oEvent.type === 'touchstart')) {
				Log.debug("Local Busy Indicator click handled on busy area: " + oEvent.target.id);
				oEvent.stopImmediatePropagation();
			} else {
				Log.debug("Local Busy Indicator Event Suppressed: " + oEvent.type);
				oEvent.preventDefault();
				oEvent.stopImmediatePropagation();
			}
		}
		function redirectFocus() {
			if (!this.bIgnoreFocus) {
				this.$blockLayer.get(0).focus();
			}
		}
		function createTabbable(fnRedirectFocus) {
			var oBlockSpan = document.createElement("span");
			oBlockSpan.setAttribute("tabindex", 0);
			oBlockSpan.classList.add("sapUiBlockLayerTabbable");
			oBlockSpan.addEventListener('focusin', fnRedirectFocus);
			return oBlockSpan;
		}
		function removeTabbable(oBlockSpan, fnRedirectFocus) {
			if (oBlockSpan.parentNode) {
				oBlockSpan.parentNode.removeChild(oBlockSpan);
			}
			oBlockSpan.removeEventListener('focusin', fnRedirectFocus);
		}
		function registerInteractionHandler(fnHandler) {
			var aSuppressHandler = [],
				oParentDOM = this.$parent.get(0),
				oBlockLayerDOM = this.$blockLayer.get(0);
			for (var i = 0; i < aPreventedEvents.length; i++) {
				oParentDOM.addEventListener(aPreventedEvents[i], fnHandler, {
					capture: true,
					passive: false
				});
				aSuppressHandler.push(EventTriggerHook.suppress(aPreventedEvents[i], oParentDOM, oBlockLayerDOM));
			}
			this.$blockLayer.on('keydown', fnHandler);
			return aSuppressHandler;
		}
		function deregisterInteractionHandler(fnHandler) {
			var i,
				oParentDOM = this.$parent.get(0),
				oBlockLayerDOM = this.$blockLayer.get(0);
			if (oParentDOM) {
				for (i = 0; i < aPreventedEvents.length; i++) {
					oParentDOM.removeEventListener(aPreventedEvents[i], fnHandler, {
						capture: true,
						passive: false
					});
				}
			}
			if (this._aSuppressHandler) {
				for (i = 0; i < this._aSuppressHandler.length; i++) {
					EventTriggerHook.release(this._aSuppressHandler[i]);
				}
			}
			if (oBlockLayerDOM) {
				this.$blockLayer.off('keydown', fnHandler);
			}
		}
	}
function fnHandleInteraction ( bEnabled ) { if ( bEnabled ) { var oParentDOM = this . $parent . get ( 0 ) ; if ( oParentDOM ) { this . fnRedirectFocus = redirectFocus . bind ( this ) ; this . oTabbableBefore = createTabbable ( this . fnRedirectFocus ) ; this . oTabbableAfter = createTabbable ( this . fnRedirectFocus ) ; oParentDOM . parentNode . insertBefore ( this . oTabbableBefore , oParentDOM ) ; oParentDOM . parentNode . insertBefore ( this . oTabbableAfter , oParentDOM . nextSibling ) ; this . _fnSuppressDefaultAndStopPropagationHandler = suppressDefaultAndStopPropagation . bind ( this ) ; this . _aSuppressHandler = registerInteractionHandler . call ( this , this . _fnSuppressDefaultAndStopPropagationHandler ) ; } else { Log . warning ( "fnHandleInteraction called with bEnabled true, but no DOMRef exists!" ) ; } } else { if ( this . oTabbableBefore ) { removeTabbable ( this . oTabbableBefore , this . fnRedirectFocus ) ; delete this . oTabbableBefore ; } if ( this . oTabbableAfter ) { removeTabbable ( this . oTabbableAfter , this . fnRedirectFocus ) ; delete this . oTabbableAfter ; } delete this . fnRedirectFocus ; deregisterInteractionHandler . call ( this , this . _fnSuppressDefaultAndStopPropagationHandler ) ; } function suppressDefaultAndStopPropagation ( oEvent ) { var bTargetIsBlockLayer = oEvent . target === this . $blockLayer . get ( 0 ) , oTabbable ; if ( bTargetIsBlockLayer && oEvent . type === 'keydown' && oEvent . keyCode === 9 ) { Log . debug ( "Local Busy Indicator Event keydown handled: " + oEvent . type ) ; oTabbable = oEvent . shiftKey ? this . oTabbableBefore : this . oTabbableAfter ; oTabbable . setAttribute ( "tabindex" , - 1 ) ; this . bIgnoreFocus = true ; oTabbable . focus ( ) ; this . bIgnoreFocus = false ; oTabbable . setAttribute ( "tabindex" , 0 ) ; oEvent . stopImmediatePropagation ( ) ; } else if ( bTargetIsBlockLayer && ( oEvent . type === 'mousedown' || oEvent . type === 'touchstart' ) ) { Log . debug ( "Local Busy Indicator click handled on busy area: " + oEvent . target . id ) ; oEvent . stopImmediatePropagation ( ) ; } else { Log . debug ( "Local Busy Indicator Event Suppressed: " + oEvent . type ) ; oEvent . preventDefault ( ) ; oEvent . stopImmediatePropagation ( ) ; } } function redirectFocus ( ) { if ( ! this . bIgnoreFocus ) { this . $blockLayer . get ( 0 ) . focus ( ) ; } } function createTabbable ( fnRedirectFocus ) { var oBlockSpan = document . createElement ( "span" ) ; oBlockSpan . setAttribute ( "tabindex" , 0 ) ; oBlockSpan . classList . add ( "sapUiBlockLayerTabbable" ) ; oBlockSpan . addEventListener ( 'focusin' , fnRedirectFocus ) ; return oBlockSpan ; } function removeTabbable ( oBlockSpan , fnRedirectFocus ) { if ( oBlockSpan . parentNode ) { oBlockSpan . parentNode . removeChild ( oBlockSpan ) ; } oBlockSpan . removeEventListener ( 'focusin' , fnRedirectFocus ) ; } function registerInteractionHandler ( fnHandler ) { var aSuppressHandler = [ ] , oParentDOM = this . $parent . get ( 0 ) , oBlockLayerDOM = this . $blockLayer . get ( 0 ) ; for ( var i = 0 ; i < aPreventedEvents . length ; i ++ ) { oParentDOM . addEventListener ( aPreventedEvents [ i ] , fnHandler , { capture : true , passive : false } ) ; aSuppressHandler . push ( EventTriggerHook . suppress ( aPreventedEvents [ i ] , oParentDOM , oBlockLayerDOM ) ) ; } this . $blockLayer . on ( 'keydown' , fnHandler ) ; return aSuppressHandler ; } function deregisterInteractionHandler ( fnHandler ) { var i , oParentDOM = this . $parent . get ( 0 ) , oBlockLayerDOM = this . $blockLayer . get ( 0 ) ; if ( oParentDOM ) { for ( i = 0 ; i < aPreventedEvents . length ; i ++ ) { oParentDOM . removeEventListener ( aPreventedEvents [ i ] , fnHandler , { capture : true , passive : false } ) ; } } if ( this . _aSuppressHandler ) { for ( i = 0 ; i < this . _aSuppressHandler . length ; i ++ ) { EventTriggerHook . release ( this . _aSuppressHandler [ i ] ) ; } } if ( oBlockLayerDOM ) { this . $blockLayer . off ( 'keydown' , fnHandler ) ; } } }
Suppress interactions on all DOM elements in the blocked section.
Suppress interactions on all DOM elements in the blocked section .
// Those two elements handle the tab chain so it is not possible to tab behind the busy section. //trigger handler deregistration needs to be done even if DomRef is already destroyed /**
		 * Handler which suppresses event bubbling for blocked section
		 *
		 * @param {object} oEvent The event on the suppressed DOM
		 * @private
		 */ // Special handling for "tab" keydown: redirect to next element before or after busy section // ignore execution of focus handler // Do not "preventDefault" to allow to focus busy indicator /**
		 * Captures and redirects focus before it reaches blocked section (from both sides)
		 *
		 * @private
		 */ // Redirect focus onto busy indicator (if not already focused) /**
		 * Create a tabbable span for the block section of the control with according focus handling.
		 *
		 * @param {function} fnRedirectFocus Focus handling function
		 * @returns {object} The span element's DOM node
		 * @private
		 */ /**
		 * Create a tabbable span for the block section of the control with according focus handling.
		 *
		 * @param {object} oBlockSpan The span element's DOM node
		 * @param {function} fnRedirectFocus Focus handling function
		 * @private
		 */ /**
		 * Register event handler to suppress event within busy section
		 *
		 * @param {function} fnHandler The handler function
		 * @returns {function[]} The suppress handlers
		 */ // Add event listeners with "useCapture" settings to suppress events before dispatching/bubbling starts //for jQuery triggered events we also need the keydown handler /**
		 * Deregister event handler to suppress event within busy section
		 *
		 * @param {function} fnHandler The handler function
		 */ // Remove event listeners with "useCapture" settings // this part should be done even no DOMRef exists