diff --git a/tests/visual/datepicker/viewport.html b/tests/visual/datepicker/viewport.html
new file mode 100644
index 0000000000..5028342b67
--- /dev/null
+++ b/tests/visual/datepicker/viewport.html
@@ -0,0 +1,277 @@
+
+
+
+
+Mon 26JanTest application details - by chrisv from #3863 (Viewport test)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mon 26JanTest
+
Application progress
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/ui.datepicker.js b/ui/ui.datepicker.js
index 831cabc917..c7705949d3 100644
--- a/ui/ui.datepicker.js
+++ b/ui/ui.datepicker.js
@@ -617,14 +617,14 @@ $.extend(Datepicker.prototype, {
var dpHeight = inst.dpDiv.outerHeight();
var inputWidth = inst.input ? inst.input.outerWidth() : 0;
var inputHeight = inst.input ? inst.input.outerHeight() : 0;
- var viewWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
- var viewHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
+ var viewWidth = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) + $(document).scrollLeft();
+ var viewHeight = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) + $(document).scrollTop();
offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
- // now check if datepicker is showing outside window viewpoint - move to a better place if so.
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
offset.left -= (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? Math.abs(offset.left + dpWidth - viewWidth) : 0;
offset.top -= (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? Math.abs(offset.top + dpHeight + inputHeight*2 - viewHeight) : 0;