- 'height' : panelElement.$.offsetHeight,\r
- 'width' : panelElement.$.offsetWidth\r
- };\r
-\r
- // If the menu is horizontal off, shift it toward\r
- // the opposite language direction.\r
- if ( rtl ? left < 0 : left + panelSize.width > viewportSize.width + windowScroll.x )\r
- left += ( panelSize.width * ( rtl ? 1 : -1 ) );\r
-\r
- // Vertical off screen is simpler.\r
- if ( top + panelSize.height > viewportSize.height + windowScroll.y )\r
- top -= panelSize.height;\r
+ // Flip to show on right.\r
+ if ( spaceBefore > rectWidth )\r
+ left += rectWidth;\r
+ // Align to window left.\r
+ else if ( viewportSize.width > rectWidth )\r
+ left = left - rect.left;\r
+ // Align to window right, never cutting the panel at right.\r
+ else\r
+ left = left - rect.right + viewportSize.width;\r
+ }\r
+ }\r
+ else if ( spaceAfter < rectWidth )\r
+ {\r
+ // Flip to show on left.\r
+ if ( spaceBefore > rectWidth )\r
+ left -= rectWidth;\r
+ // Align to window right.\r
+ else if ( viewportSize.width > rectWidth )\r
+ left = left - rect.right + viewportSize.width;\r
+ // Align to window left, never cutting the panel at left.\r
+ else\r
+ left = left - rect.left;\r
+ }\r
+\r
+\r
+ // Check if the default vertical layout is possible.\r
+ var spaceBelow = viewportSize.height - rect.top,\r
+ spaceAbove = rect.top;\r
+\r
+ if ( spaceBelow < rectHeight )\r
+ {\r
+ // Flip to show above.\r
+ if ( spaceAbove > rectHeight )\r
+ top -= rectHeight;\r
+ // Align to window bottom.\r
+ else if ( viewportSize.height > rectHeight )\r
+ top = top - rect.bottom + viewportSize.height;\r
+ // Align to top, never cutting the panel at top.\r
+ else\r
+ top = top - rect.top;\r
+ }\r