Index: /CKEditor/branches/prototype/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/prototype/_source/plugins/dialog/plugin.js	(revision 2512)
+++ /CKEditor/branches/prototype/_source/plugins/dialog/plugin.js	(revision 2513)
@@ -211,4 +211,9 @@
 	})(),
 
+	getSize : function()
+	{
+		return CKEDITOR.tools.extend( {}, this._.size );
+	},
+
 	move : (function()
 	{
@@ -240,5 +245,5 @@
 	})(),
 
-	getScreenPosition : function(){ return this._.position; },
+	getScreenPosition : function(){ return CKEDITOR.tools.extend( {}, this._.position ); },
 
 	show : function()
@@ -689,12 +694,36 @@
 	{
 		var lastCoords = null,
+			abstractDialogCoords = null,
 			element = dialog.getElement().getFirst(),
 			mouseMoveHandler = function( evt )
 			{
-				var dialogCoords = dialog.getScreenPosition(),
-					dx = evt.data.$.screenX - lastCoords.x,
-					dy = evt.data.$.screenY - lastCoords.y;
-				lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
-				dialog.move( dialogCoords.x + dx, dialogCoords.y + dy );
+				var dialogSize = dialog.getSize(),
+					viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(),
+					x = evt.data.$.screenX,
+					y = evt.data.$.screenY,
+					dx = x - lastCoords.x,
+					dy = y - lastCoords.y,
+					magnetDistance = 20,
+					realX, realY;
+
+				lastCoords = { x : x, y : y };
+				abstractDialogCoords.x += dx;
+				abstractDialogCoords.y += dy;
+
+				if ( abstractDialogCoords.x < magnetDistance )
+					realX = 0;
+				else if ( abstractDialogCoords.x > viewPaneSize.width - dialogSize.width - magnetDistance )
+					realX = viewPaneSize.width - dialogSize.width;
+				else
+					realX = abstractDialogCoords.x;
+
+				if ( abstractDialogCoords.y < magnetDistance )
+					realY = 0;
+				else if ( abstractDialogCoords.y > viewPaneSize.height - dialogSize.height - magnetDistance )
+					realY = viewPaneSize.height - dialogSize.height;
+				else
+					realY = abstractDialogCoords.y;
+
+				dialog.move( realX, realY );
 			},
 			mouseUpHandler = function( evt )
@@ -717,4 +746,5 @@
 					CKEDITOR.document.on( 'mousemove', mouseMoveHandler );
 					CKEDITOR.document.on( 'mouseup', mouseUpHandler );
+					abstractDialogCoords = dialog.getScreenPosition();
 
 					if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
