fnSetArrow = function (oThis) {
                // jQuery Plugin "rect"
                var sKey = "",
                    iVal = 0,
                    iZero = 0, // this is the 0 of the  relative position between ToolPopup and Opener
                    iHalfArrow = oThis.iArrowHeight / 2,
                    isRTL = Configuration.getRTL(),
                    sArrowDir,
                    oPopRect = oThis.$().rect(),
                    oOpener = jQuery(document.getElementById(oThis.getOpener())),
                    oOpenerRect = oOpener.rect(),
                    popupBorder = 0,
                    $Arrow = oThis.$("arrow");

                if (!oThis.getDomRef()) {
                    return;
                }

                oThis._sArrowDir = fnGetArrowDirection(oThis);
                sArrowDir = oThis._sArrowDir;
                if (isRTL) {
                    // in RTL mode arrow must be mirrowed here
                    if (oThis._sArrowDir === "Right") {
                        sArrowDir = "Left";
                    } else if (oThis._sArrowDir === "Left") {
                        sArrowDir = "Right";
                    }
                }

                if (!oOpenerRect) {
                    // if a proper opener isn't available
                    Log.warning("Opener wasn't set properly. Therefore arrow will be at a default position", "", "sap.ui.ux3.ToolPopup");
                }


                // get the corresponding my-property
                if (!oThis._my && oThis.oPopup) {
                    oThis._my = oThis.oPopup._oPosition.my;
                }

                // calculate the horizontal/vertical value of the arrow
                if (oThis._bHorizontalArrow) {
                    // left or right arrow
                    sKey = "top";

                    if (oOpenerRect) {
                        popupBorder = parseInt(oThis.$().css('border-top-width')) || 0;
                        iZero = parseInt(oOpenerRect.top - popupBorder - oPopRect.top);

                        iVal = Math.round(iZero + oOpenerRect.height / 2 - iHalfArrow);

                        // if the position would exceed the ToolPopup's height
                        iVal = iVal + iHalfArrow > oPopRect.height ? iVal - oThis.iArrowHeight : iVal;
                    }
                } else {
                    // up/down arrow
                    sKey = "left";

                    if (oOpenerRect) {

                        if (isRTL) {
                            sKey = "right";
                            popupBorder = parseInt(oThis.$().css('border-right-width')) || 0;
                            iZero = parseInt(oPopRect.left + oPopRect.width - oOpenerRect.left - oOpenerRect.width - popupBorder);
                        } else {
                            popupBorder = parseInt(oThis.$().css('border-left-width')) || 0;
                            iZero = parseInt(oOpenerRect.left - oPopRect.left - popupBorder);
                        }

                        iVal = Math.round(iZero + oOpenerRect.width / 2 - iHalfArrow);
                        // if the position would exceed the ToolPopup's width
                        iVal = iVal + iHalfArrow > oPopRect.width ? iVal - oThis.iArrowHeight : iVal;
                    }
                }

                // This is very specific code that applies to HCB theme. This theme has a different logic
                // for setting the arrow and so we have another logic
                if (!oOpenerRect) {
                    iVal = oThis.iArrowHeight;
                }

                // set the corresponding classes
                var sClassAttr = "";
                if ($Arrow.hasClass("sapUiUx3TPNewArrow")) {
                    sClassAttr = "sapUiUx3TPNewArrow sapUiUx3TPNewArrow";
                } else {
                    sClassAttr = oThis.isInverted() ? "sapUiUx3TPArrow sapUiTPInverted sapUiUx3TPArrow" : "sapUiUx3TPArrow sapUiUx3TPArrow";
                }
                $Arrow.attr("class", sClassAttr + sArrowDir);

                if (sArrowDir === "Right") {
                    var iWidth = oPopRect.width;
                    // if the ToolPopup is invertable and it is being inverted use another
                    // value since in such a case the padding is different for the arrow
                    if (oThis.isInverted()) {
                        iWidth += oThis.iArrowPaddingInverted;
                    } else {
                        iWidth += oThis.iArrowPadding;
                    }

                    if (isRTL) {
                        $Arrow.css("right", iWidth + "px");
                    } else {
                        $Arrow.css("left", iWidth + "px");
                    }
                } else {
                    $Arrow.css({
                        "left": "",
                        "right": ""
                    });
                }

                iVal = parseInt(iVal);
                iVal = iVal < -popupBorder ? -popupBorder : iVal;

                $Arrow.css(sKey, iVal + "px");
            }
Calculates the desired arrow position related to the set docking and to the size of the popup.
This only works when "my" and "at" both use the jQuery-based docking which means they
are strings like "begin top".
If there is no opener set properly an error is logged into the console and there will
be no arrow for the ToolPopup.

@param {sap.ui.ux3.ToolPopup} oThis
@private