aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Wood <kbwood.au@gmail.com>2008-06-20 23:29:02 +0000
committerKeith Wood <kbwood.au@gmail.com>2008-06-20 23:29:02 +0000
commitf3d1eadf1975064f8b8dfc6ba179a498a4431b05 (patch)
tree1828531d641441c21cf0a1eeecf27c6eb961a192
parent281f88d108d92efaa0a9f99f3ef0f373f1a53ab3 (diff)
downloadjquery-ui-f3d1eadf1975064f8b8dfc6ba179a498a4431b05.tar.gz
jquery-ui-f3d1eadf1975064f8b8dfc6ba179a498a4431b05.zip
Correct datepicker placement when used in static areas
Correct select coverage in IE 6-
-rw-r--r--ui/ui.datepicker.js43
1 files changed, 23 insertions, 20 deletions
diff --git a/ui/ui.datepicker.js b/ui/ui.datepicker.js
index 142ce96d5..c04252da8 100644
--- a/ui/ui.datepicker.js
+++ b/ui/ui.datepicker.js
@@ -101,8 +101,7 @@ function Datepicker() {
maxDate: null, // The latest selectable date, or null for no limit
speed: 'normal', // Speed of display/closure
beforeShowDay: null, // Function that takes a date and returns an array with
- // [0] = true if selectable, false if not,
- // [1] = custom CSS class name(s) or '',
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
// [2] = cell title (optional), e.g. $.datepicker.noWeekends
beforeShow: null, // Function that takes an input field and
// returns a set of custom settings for the date picker
@@ -444,6 +443,7 @@ $.extend(Datepicker.prototype, {
var isFixed = false;
$(input).parents().each(function() {
isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
});
if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
$.datepicker._pos[0] -= document.documentElement.scrollLeft;
@@ -459,7 +459,7 @@ $.extend(Datepicker.prototype, {
inst._datepickerDiv.width(inst._getNumberOfMonths()[1] *
$('.ui-datepicker', inst._datepickerDiv[0])[0].offsetWidth);
// and adjust position before showing
- offset = $.datepicker._checkOffset(inst, offset);
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
inst._datepickerDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
left: offset.left + 'px', top: offset.top + 'px'});
@@ -483,7 +483,11 @@ $.extend(Datepicker.prototype, {
/* Generate the date picker content. */
_updateDatepicker: function(inst) {
- inst._datepickerDiv.empty().append(inst._generateDatepicker());
+ var dims = {width: inst._datepickerDiv.width() + 4,
+ height: inst._datepickerDiv.height() + 4};
+ inst._datepickerDiv.empty().append(inst._generateDatepicker()).
+ find('iframe.ui-datepicker-cover').
+ css({width: dims.width, height: dims.height});
var numMonths = inst._getNumberOfMonths();
if (numMonths[0] != 1 || numMonths[1] != 1)
inst._datepickerDiv.addClass('ui-datepicker-multi');
@@ -500,27 +504,26 @@ $.extend(Datepicker.prototype, {
},
/* Check positioning to remain on screen. */
- _checkOffset: function(inst, offset) {
- var isFixed = inst._datepickerDiv.css('position') == 'fixed';
+ _checkOffset: function(inst, offset, isFixed) {
var pos = inst._input ? $.datepicker._findPos(inst._input[0]) : null;
- var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
- var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
- var scrollX = (isFixed ? 0 : document.documentElement.scrollLeft || document.body.scrollLeft);
- var scrollY = (isFixed ? 0 : document.documentElement.scrollTop || document.body.scrollTop);
+ var browserWidth = window.innerWidth || document.documentElement.clientWidth;
+ var browserHeight = window.innerHeight || document.documentElement.clientHeight;
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
// reposition date picker horizontally if outside the browser window
- if ((offset.left + inst._datepickerDiv.width() -
- (isFixed && $.browser.msie ? document.documentElement.scrollLeft : 0)) >
- (browserWidth + scrollX))
- offset.left = Math.max(scrollX,
- pos[0] + (inst._input ? $(inst._input[0]).width() : null) - inst._datepickerDiv.width() -
+ if ((offset.left + inst._datepickerDiv.width() - scrollX) > browserWidth)
+ offset.left = Math.max((isFixed ? 0 : scrollX),
+ pos[0] + (inst._input ? inst._input.width() : 0) - (isFixed ? scrollX : 0) - inst._datepickerDiv.width() -
(isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0));
+ else
+ offset.left -= (isFixed ? scrollX : 0);
// reposition date picker vertically if outside the browser window
- if ((offset.top + inst._datepickerDiv.height() -
- (isFixed && $.browser.msie ? document.documentElement.scrollTop : 0)) >
- (browserHeight + scrollY))
- offset.top = Math.max(scrollY,
- pos[1] - (this._inDialog ? 0 : inst._datepickerDiv.height()) -
+ if ((offset.top + inst._datepickerDiv.height() - scrollY) > browserHeight)
+ offset.top = Math.max((isFixed ? 0 : scrollY),
+ pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst._datepickerDiv.height()) -
(isFixed && $.browser.opera ? document.documentElement.scrollTop : 0));
+ else
+ offset.top -= (isFixed ? scrollY : 0);
return offset;
},