Author: gseitz Date: Tue Sep 25 10:47:45 2007 New Revision: 579329 URL: http://svn.apache.org/viewvc?rev=579329&view=rev Log: WICKET-880: automatically position the datepicker so that it isn't rendered off screen on the right side or bottom
Modified: wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js Modified: wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js?rev=579329&r1=579328&r2=579329&view=diff ============================================================================== --- wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js (original) +++ wicket/trunk/jdk-1.4/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js Tue Sep 25 10:47:45 2007 @@ -69,8 +69,27 @@ return (value < 10 ? "0" : "") + value; } +/** + * Gets the height of the displayed area of the window, as YAHOO.util.Dom.getViewportHeight() + * has issues with Firefox. + * See http://tech.groups.yahoo.com/group/ydn-javascript/message/5850 + * Implementation taken from: http://www.quirksmode.org/viewport/compatibility.html#link2 + */ +Wicket.DateTime.getViewportHeight = function() { + if (window.innerHeight) // all browsers except IE + viewPortHeight = window.innerHeight; + else if (document.documentElement && document.documentElement.clientHeight) // IE 6 strict mode + viewPortHeight = document.documentElement.height; + else if (document.body) // other IEs + viewPortHeight = document.body.clientHeight; + return viewPortHeight; +} + /** - * Position subject relative to target top-left. + * Position subject relative to target top-left by default. + * If there is too little space on the right side/bottom, + * the datepicker's position is corrected so that the right side/bottom + * is aligned with the display area's right side/bottom. * @param subject the dom element to has to be positioned * @param target id of the dom element to position relative to */ @@ -78,8 +97,25 @@ targetPos = YAHOO.util.Dom.getXY(target); targetHeight = YAHOO.util.Dom.get(target).offsetHeight; - YAHOO.util.Dom.setX(subject, targetPos[0]); - YAHOO.util.Dom.setY(subject, targetPos[1] + targetHeight + 1); + subjectHeight = YAHOO.util.Dom.get(subject).offsetHeight; + subjectWidth = YAHOO.util.Dom.get(subject).offsetWidth; + + viewPortHeight = Wicket.DateTime.getViewportHeight(); + viewPortWidth = YAHOO.util.Dom.getViewportWidth(); + + // correct datepicker's position so that it isn't rendered off screen on the right side or bottom + if (targetPos[0] + subjectWidth > viewPortWidth) { + // correct horizontal position + YAHOO.util.Dom.setX(subject, viewPortWidth - subjectWidth); + } else { + YAHOO.util.Dom.setX(subject, targetPos[0]); + } + if (targetPos[1] + targetHeight + 1 + subjectHeight > viewPortHeight) { + // correct vertical position + YAHOO.util.Dom.setY(subject, viewPortHeight - subjectHeight); + } else { + YAHOO.util.Dom.setY(subject, targetPos[1] + targetHeight + 1); + } } /**