in wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js [534:607]
function calculateAndSetPopupBounds(input, popup)
{
var leftPosition=0;
var topPosition=0;
var inputPosition=getPosition(input);
if (cfg.useSmartPositioning) {
// there are 4 possible positions for the popup: top-left, top-right, buttom-left, bottom-right
// relative to the field; we will try to use the position that does not get out of the visible page
if (popup.style.width === "auto") {
popup.style.left = "0px"; // allow browser to stretch div as much as needed to see where the popup should be put
popup.style.top = "0px";
}
var windowScrollXY = getWindowScrollXY();
var windowWH = getWindowWidthAndHeigth();
var windowScrollX = windowScrollXY[0];
var windowScrollY = windowScrollXY[1];
var windowWidth = windowWH[0];
var windowHeight = windowWH[1];
var dx1 = windowScrollX + windowWidth - inputPosition[0] - popup.offsetWidth;
var dx2 = inputPosition[0] + input.offsetWidth - popup.offsetWidth - windowScrollX;
if (popup.style.width === "auto" && dx1 < 0 && dx2 < 0) {
// browser determined popup width; if it does not fit either right or left aligned with the input, calculate and set fixed width
// so that after initial position calculation after popup opens, bounds do not change every time a mouse over or other event happens.
// The browser can change the width/height when div if repositioned - if they were not already restricted because of maxHeight and field width (and that can result in a relocation of the div and so on).
var newW = popup.offsetWidth + Math.max(dx1, dx2) - containerBorderWidths[0];
popup.style.width = (newW >= 0 ? newW : popup.offsetWidth + Math.max(dx1, dx2))+'px';
dx1 = windowScrollX + windowWidth - inputPosition[0] - popup.offsetWidth;
dx2 = inputPosition[0] + input.offsetWidth - popup.offsetWidth - windowScrollX;
}
var dy1 = windowScrollY + windowHeight - inputPosition[1] - input.offsetHeight - popup.offsetHeight;
var dy2 = inputPosition[1] - popup.offsetHeight - windowScrollY;
if (dy1 < 0 && dy2 < 0) {
// limit height if it gets outside the screen
var newH = popup.offsetHeight + Math.max(dy1, dy2) - containerBorderWidths[1];
popup.style.height = (newH >= 0 ? newH : popup.offsetHeight + Math.max(dy1, dy2))+'px';
dy1 = windowScrollY + windowHeight - inputPosition[1] - input.offsetHeight - popup.offsetHeight;
dy2 = inputPosition[1] - popup.offsetHeight - windowScrollY;
}
// choose the location that shows the most surface of the popup, with preference for bottom right
if (dx1 < 0 && dx1 < dx2) {
if (dy1 < 0 && dy1 < dy2) {
// choice 4 : top left
leftPosition = inputPosition[0] + input.offsetWidth - popup.offsetWidth;
topPosition = inputPosition[1] - popup.offsetHeight;
} else {
// choice 3 : bottom left
leftPosition = inputPosition[0] + input.offsetWidth - popup.offsetWidth;
topPosition = inputPosition[1] + input.offsetHeight;
}
} else {
if (dy1 < 0 && dy1 < dy2) {
// choice 2 : top right
leftPosition = inputPosition[0];
topPosition = inputPosition[1] - popup.offsetHeight;
} else {
// choice 1 : bottom right
leftPosition = inputPosition[0];
topPosition = inputPosition[1] + input.offsetHeight;
}
}
if (popup.style.width === "auto") {
var newWidth = popup.offsetWidth - containerBorderWidths[0];
popup.style.width = (newWidth >= 0 ? (newWidth + (popup.scrollWidth-popup.clientWidth)) : popup.offsetWidth)+'px';
}
} else {
leftPosition = inputPosition[0];
topPosition = inputPosition[1] + input.offsetHeight;
}
popup.style.left=leftPosition+'px';
popup.style.top=topPosition+'px';
}