Index: /FCKeditor/branches/features/floating_dialog/editor/fckdialog.html
===================================================================
--- /FCKeditor/branches/features/floating_dialog/editor/fckdialog.html	(revision 1253)
+++ /FCKeditor/branches/features/floating_dialog/editor/fckdialog.html	(revision 1254)
@@ -108,5 +108,5 @@
 
 // Resize related functions.
-var Sizer = (function()
+var Sizer = function()
 {
 	var bAutoSize = false ;
@@ -227,8 +227,8 @@
 
 	return retval ;
-})() ;
+}() ;
 
 // Manages the throbber image that appears if the inner part of dialog is taking too long to load.
-var Throbber = (function()
+var Throbber = function()
 {
 	var retval = {
@@ -271,8 +271,125 @@
 		} ) ;
 	return retval ;
-})() ;
+}() ;
+
+// Drag and drop handlers.
+var DragAndDrop = function()
+{
+	var registeredWindows = [] ;
+	var lastCoords = null ;
+	
+	var getMouseCoordinates = function( evt )
+	{
+		var element = evt.srcElement || evt.target ;
+		var doc = FCKTools.GetElementDocument( element ) ;
+		var view = doc.parentWindow || evt.view ;
+		var retval = { 'x': evt.clientX, 'y': evt.clientY };
+
+		if ( view != Args().TopWindow )
+		{
+			var offset = FCKTools.GetDocumentPosition( Args().TopWindow, doc.documentElement ) ;
+			retval.x += offset.x ;
+			retval.y += offset.y ;
+		}
+
+		return retval ;
+	}
+
+	var cleanUpHandlers = function()
+	{
+		for ( var i = 0 ; i < registeredWindows.length ; i++ )
+		{
+			FCKTools.RemoveEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
+			FCKTools.RemoveEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
+		}
+	}
+
+	var dragMouseMoveHandler = function( evt )
+	{
+		if ( !lastCoords )
+			return ;
+
+		// Debouncing logic for Opera, for preventing the dialog from vibrating during mouse drags.
+		if ( FCKBrowserInfo.IsOpera )
+		{
+			if ( window.LastMoveTimestamp > (new Date()).getTime() - 20 )
+				return ;
+			else
+				window.LastMoveTimestamp = (new Date()).getTime() ;
+		}
+
+		if ( !evt )
+			evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
+
+		var currentCoords = getMouseCoordinates( evt );
+		var dx = currentCoords.x - lastCoords.x;
+		var dy = currentCoords.y - lastCoords.y;
+		lastCoords = currentCoords;
+
+		var x = parseInt( FCKDomTools.GetCurrentElementStyle( Args().TopWindow, frameElement, 'left' ) ) + dx ;
+		var y = parseInt( FCKDomTools.GetCurrentElementStyle( Args().TopWindow, frameElement, 'top' ) ) + dy ;
+		FCKDomTools.SetElementStyles( frameElement,
+				{
+				'left' : x + 'px',
+				'top' : y + 'px'
+				} ) ;
+
+		if ( evt.preventDefault )
+			evt.preventDefault() ;
+		else
+			evt.returnValue = false ;
+	}
+
+	var dragMouseUpHandler = function( evt )
+	{
+		if ( !lastCoords )
+			return ;
+		if ( !evt )
+			evt = FCKTools.GetElementDocument( this ).parentWindow.event ;
+		cleanUpHandlers() ;
+		lastCoords = null ;
+	}
+
+	return {
+
+		MouseDownHandler : function( evt )
+		{
+			var view = null ;
+			if ( !evt )
+			{
+				view = FCKTools.GetElementDocument( this ).parentWindow ;
+				evt = view.event ;
+			}
+			else
+				view = evt.view ;
+
+			var target = evt.srcElement || evt.target ;
+			if ( target.id == 'closeButton' || target.className == 'DialogTab' || target.className == 'DialogTabSelected' )
+				return ;
+
+			lastCoords = getMouseCoordinates( evt ) ;
+
+			for ( var i = 0 ; i < registeredWindows.length ; i++ )
+			{
+				FCKTools.AddEventListener( registeredWindows[i].document, 'mousemove', dragMouseMoveHandler ) ;
+				FCKTools.AddEventListener( registeredWindows[i].document, 'mouseup', dragMouseUpHandler ) ;
+			}
+
+			if ( evt.preventDefault )
+				evt.preventDefault() ;
+			else
+				evt.returnValue = false ;
+		},
+
+		RegisterHandlers : function( w )
+		{
+			registeredWindows.push( w ) ;
+		}
+	}
+}() ;
+
 
 // The business logic of the dialog, dealing with operational things like dialog open/dialog close/enable/disable/etc.
-var Main = (function()
+var Main = function()
 {
 	var retval = {
@@ -290,9 +407,9 @@
 			// Make the title area draggable.
 			var titleElement = $( 'header' ) ;
-			// titleElement.onmousedown = DnD.MouseDownHandler ;
+			titleElement.onmousedown = DragAndDrop.MouseDownHandler ;
 
 			// Connect mousemove and mouseup events from dialog frame and outer window to dialog dragging logic.
-			// DnD.RegisterHandlers( window ) ;
-			// DnD.RegisterHandlers( args.TopWindow ) ;
+			DragAndDrop.RegisterHandlers( window ) ;
+			DragAndDrop.RegisterHandlers( Args().TopWindow ) ;
 
 			// Disable the previous dialog if it exists.
@@ -327,5 +444,5 @@
 					while ( currentParent )
 					{
-						// DnD.RegisterHandlers( currentParent.contentWindow ) ;
+						DragAndDrop.RegisterHandlers( currentParent.contentWindow ) ;
 						currentParent = ParentDialog( currentParent ) ;
 					}
@@ -391,5 +508,5 @@
 			Sizer.RefreshContainerSize();
 
-			// DnD.RegisterHandlers( innerWindow ) ;
+			DragAndDrop.RegisterHandlers( innerWindow ) ;
 			
 			innerWindow.focus() ;
@@ -400,5 +517,5 @@
 
 	return retval ;
-})() ;
+}() ;
 
 // Export some packaged functions for use in the inner dialog code.
Index: /FCKeditor/branches/features/floating_dialog/test_results
===================================================================
--- /FCKeditor/branches/features/floating_dialog/test_results	(revision 1253)
+++ /FCKeditor/branches/features/floating_dialog/test_results	(revision 1254)
@@ -9,2 +9,3 @@
 6. Added Init(), Throbber(), ResizeContainerSize()/No noticeable increase after 10 minutes. 
 7. Added all resize logic, LoadInnerDialog() and InnerDialogLoaded(), created the Sizer and Main modules/No noticeable increase after 10 minutes.
+8. Added drag and drop handlers/No noticeable increase
