You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2019/05/09 06:32:54 UTC

[wicket] 01/11: JS removed debug window and use browser console instead

This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a commit to branch wicket-js-cleanup
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit ae3e68d38ced8e2acc1f32d484766a4cee7af5cc
Author: Sven Meier <sv...@apache.org>
AuthorDate: Fri May 3 09:26:28 2019 +0200

    JS removed debug window and use browser console instead
    
    let debugbar indicate ajax errors; moved drag support to modal.js
---
 .../WicketAjaxDebugJQueryResourceReference.java    |  65 -----
 .../wicket/ajax/res/js/wicket-ajax-jquery-debug.js | 270 ---------------------
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       | 219 +++--------------
 .../wicket/resource/CoreLibrariesContributor.java  |  12 +-
 .../wicket/settings/JavaScriptLibrarySettings.java |  27 +--
 .../apache/wicket/TestDetachPageAjaxResult.html    |   3 +-
 .../wicket/TestDetachPageExpectedResult.html       |   3 +-
 .../wicket/ajax/AjaxBehaviorEnabled_expected.html  |   3 +-
 .../ajax/AjaxHeaderContributionPage2_expected.html |   3 +-
 .../ajax/AjaxHeaderContributionPage_expected.html  |   3 +-
 .../ajax/DomReadyOrderPage_ajax_expected.html      |   3 +-
 .../wicket/ajax/DomReadyOrderPage_expected.html    |   3 +-
 .../ajax/form/AjaxFormSubmitTestPage_expected.html |   3 +-
 .../OnChangeAjaxBehaviorTestPage_expected.html     |   3 +-
 .../html/ajaxLink/AjaxLinkPageExpectedResult.html  |   3 +-
 .../AjaxLinkWithBorderPageExpectedResult.html      |   3 +-
 .../html/ajaxLink/AjaxPage2_ExpectedResult.html    |   3 +-
 .../SimpleTestPageExpectedResult-1.html            |   3 +-
 .../componentMap/SimpleTestPageExpectedResult.html |   3 +-
 .../markup/head/filter/DeferredPageExpected.html   |   3 +-
 .../html/basic/SimplePageExpectedResult_13.html    |   3 +-
 .../border/HideableBorderPage_ExpectedResult.html  |   3 +-
 .../panel/InlinePanelPageExpectedResult_7.html     |   3 +-
 .../panel/InlinePanelPageExpectedResult_8.html     |   3 +-
 .../locator/CachingResourceStreamLocatorTest.java  |   6 +-
 wicket-core/src/test/js/ajax.js                    |   2 +-
 .../apache/wicket/devutils/debugbar/DebugBar.html  |   4 +-
 .../apache/wicket/devutils/debugbar/DebugBar.java  |   5 +-
 .../wicket/devutils/debugbar/wicket-debugbar.css   |  11 +-
 .../wicket/devutils/debugbar/wicket-debugbar.js    | 104 ++++----
 .../examples/ajax/builtin/AjaxApplication.java     |   2 -
 .../extensions/ajax/markup/html/modal/res/modal.js | 164 +++++++++++++
 32 files changed, 295 insertions(+), 653 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/WicketAjaxDebugJQueryResourceReference.java b/wicket-core/src/main/java/org/apache/wicket/ajax/WicketAjaxDebugJQueryResourceReference.java
deleted file mode 100644
index b881502..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/WicketAjaxDebugJQueryResourceReference.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.ajax;
-
-import java.util.List;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.markup.head.HeaderItem;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.request.resource.ResourceReference;
-
-/**
- * @author hoeve
- */
-public class WicketAjaxDebugJQueryResourceReference extends JavaScriptResourceReference
-{
-	private static final long serialVersionUID = 1L;
-
-	private static final WicketAjaxDebugJQueryResourceReference INSTANCE = new WicketAjaxDebugJQueryResourceReference();
-
-	/**
-	 * @return the singleton INSTANCE
-	 */
-	public static WicketAjaxDebugJQueryResourceReference get()
-	{
-		return INSTANCE;
-	}
-
-	private WicketAjaxDebugJQueryResourceReference()
-	{
-		super(AbstractDefaultAjaxBehavior.class, "res/js/wicket-ajax-jquery-debug.js");
-	}
-
-	@Override
-	public List<HeaderItem> getDependencies()
-	{
-		final ResourceReference wicketAjaxReference;
-		if (Application.exists())
-		{
-			wicketAjaxReference = Application.get().getJavaScriptLibrarySettings().getWicketAjaxReference();
-		}
-		else
-		{
-			wicketAjaxReference = WicketAjaxJQueryResourceReference.get();
-		}
-		List<HeaderItem> dependencies = super.getDependencies();
-		dependencies.add(JavaScriptHeaderItem.forReference(wicketAjaxReference));
-		return dependencies;
-	}
-}
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js
deleted file mode 100644
index 58425c3..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*jshint maxlen: 430 */
-/*global console: true */
-
-
-/*
- * Wicket Ajax Debug Window
- */
-
-;(function (undefined) {
-
-	'use strict';
-
-	if (typeof(Wicket) === 'undefined') {
-		window.Wicket = {};
-	}
-
-	if (typeof(Wicket.Ajax) === 'undefined') {
-		Wicket.Ajax = {};
-	}
-
-	if (typeof(Wicket.Ajax.DebugWindow) === 'object') {
-		return;
-	}
-
-	Wicket.Ajax.DebugWindow = {
-
-		/**
-		 * A flag indicating whether the ajax debug window is enabled. Switched on by AbstractDefaultAjaxBehavior.java
-		 */
-		enabled: false,
-
-		scrollLock : false,
-
-		debugWindowId : 'wicketAjaxDebugWindow',
-
-		debugWindowScrollLockLinkId : 'wicketAjaxDebugScrollLock',
-
-		debugWindowDragHandleId : 'wicketAjaxDebugWindowDragHandle',
-
-		debugWindowResizeHandleId : 'wicketAjaxDebugWindowResizeHandle',
-
-		debugWindowLogId : 'wicketAjaxDebugWindowLogId',
-
-		wicketDebugLink: 'wicketDebugLink',
-
-		throttler: new Wicket.Throttler(true),
-
-		showDebugWindow : function() {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-
-			jQuery('#'+self.wicketDebugLink)
-				.css('backgroundColor', 'white')
-				.css('color', 'blue');
-
-			jQuery('#'+self.debugWindowId).slideToggle("fast", "swing");
-		},
-
-		hideDebugWindow : function() {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-			jQuery('#'+self.debugWindowId).slideToggle("fast", "swing");
-		},
-
-		log : function(msg, label) {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-			var $log = jQuery('#'+self.debugWindowLogId);
-			var $child = jQuery("<div>");
-
-			msg = "" + msg;
-			msg = msg.replace(/&/g, "&amp;");
-			msg = msg.replace(/</g, "&lt;");
-			msg = msg.replace(/>/g, "&gt;");
-			msg = msg.replace(/\n/g, "<br/>");
-			// WICKET-6340 do not use nbsp, it may not be defined in XHTML markup
-			msg = msg.replace(/ /g, "&#160;");
-			msg = msg.replace(/\t/g, "&#160;&#160;&#160;&#160;");
-
-			if (typeof(label) !== "undefined") {
-				msg = "<b>" + label + "</b>" + msg;
-			}
-
-			$child.html(msg);
-			$child
-				.css('fontSize','82%')
-				.css('margin', '0px')
-				.css('padding', '0px');
-			$log.append($child);
-
-			if (self.scrollLock === false) {
-				$log.scrollTop($log[0].scrollHeight);
-			}
-		},
-
-		logError : function (msg) {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-			self.log(msg, "<span style='color: red'>ERROR</span>: ");
-
-			if (jQuery('#'+self.debugWindowId).css('display') === 'none') {
-				jQuery('#'+self.wicketDebugLink)
-					.css('backgroundColor', 'crimson')
-					.css('color', 'aliceBlue');
-
-				self.throttler.throttle("Wicket.Ajax.DebugWindow", 300, function() {
-					jQuery('#'+self.wicketDebugLink)
-						// poor man's animation to get developer's attention
-						.hide(150).show(150).hide(150).show(150);
-				});
-			}
-
-			if (typeof(console) !== "undefined" && typeof(console.error) === 'function') {
-				console.error('Wicket.Ajax: ', msg);
-			}
-		},
-
-		logInfo : function(msg) {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-			self.log(msg, "<span style='color: blue'>INFO</span>: ");
-		},
-
-		clearLog : function() {
-			var self = Wicket.Ajax.DebugWindow;
-			self.init();
-			jQuery('#'+self.debugWindowLogId).empty();
-		},
-
-		init : function() {
-
-			if ( Wicket.Ajax.DebugWindow.enabled) {
-				var self = Wicket.Ajax.DebugWindow;
-				var $window = jQuery('#'+self.debugWindowId);
-				var dwdhid = self.debugWindowDragHandleId;
-				var dwrhid = self.debugWindowResizeHandleId;
-
-				if ($window.length === 0) {
-
-					var html =
-						"<div style='width: 450px; display: none; position: absolute; left: 200px; top: 300px; z-index: 1000000;' id='"+self.debugWindowId+"'>"+
-						"	<div style='border: 1px solid black; padding: 1px; background-color: #eee'>"+
-						"		<div style='overflow: auto; width: 100%'>"+
-						"			<div style='float: right; padding: 0.2em; padding-right: 1em; color: black;'>"+
-						"               <a href='javascript:Wicket.Ajax.DebugWindow.switchScrollLock()' id='"+self.debugWindowScrollLockLinkId+
-											"' style='color:blue' onfocus='this.blur();'>scroll lock</a> |"+
-						"				<a href='javascript:Wicket.Ajax.DebugWindow.clearLog()' style='color:blue'>clear</a> | "+
-						"				<a href='javascript:Wicket.Ajax.DebugWindow.hideDebugWindow()' style='color:blue'>close</a>"+
-						"			</div>"+
-						"			<div id='"+dwdhid+
-										"' style='padding: 0.2em; background-color: gray; color: white; padding-left: 1em; margin-right: 14em; cursor: move;'>"+
-						"				Wicket Ajax Debug Window (drag me here)"+
-						"			</div>"+
-						"			<div id='"+self.debugWindowLogId+"' style='width: 100%; height: 200px; background-color: white; color: black; overflow: auto; white-space: nowrap; text-align:left;'>"+
-						"			</div>"+
-						"           <div style='height: 10px; margin:0px; padding:0px;overflow:hidden;'>"+
-						"              <div style='height: 10px; width: 10px; background-color: gray; margin:0px; padding: 0px;overflow:hidden; float:right; cursor: nw-resize' id='" + self.debugWindowResizeHandleId + "'>"+
-						"              </div>"+
-						"           </div>"+
-						"		</div>"+
-						"	</div>" +
-						"</div>";
-
-
-					// Special style for Internet 6 and 7 in quirks mode
-					if (Wicket.Browser.isIELessThan11() && Wicket.Browser.isIEQuirks()) {
-						html +=
-							"<a id='"+self.wicketDebugLink+"' style='position:absolute; right: 10px; bottom: 10px; z-index:1000000; padding-top: 0.3em; padding-bottom: 0.3em; line-height: normal ; _padding-top: 0em; width: 12em; border: 1px solid black; background-color: white; text-align: center; opacity: 0.7; filter: alpha(opacity=70); color: blue; " +
-							"                                  left: expression(-10 - wicketDebugLink.offsetWidth + eval(document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) +(document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth));"+
-							"                                  top: expression(-10 - wicketDebugLink.offsetHeight + eval(document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight));'";
-					} else {
-						html +=
-							"<a id='"+self.wicketDebugLink+"' style='position:fixed; right: 10px; bottom: 10px; z-index:1000000; padding-top: 0.3em; padding-bottom: 0.3em; line-height: normal ; _padding-top: 0em; width: 12em; border: 1px solid black; background-color: white; text-align: center; opacity: 0.7;  color: blue;'";
-					}
-
-					html += "  href='javascript:Wicket.Ajax.DebugWindow.showDebugWindow()'>WICKET AJAX DEBUG</a>";
-
-					jQuery(html).appendTo(document.body);
-					Wicket.$(self.debugWindowScrollLockLinkId).focusSet = true;
-					Wicket.Drag.init(Wicket.$(dwdhid), jQuery.noop, jQuery.noop, self.onDrag);
-					Wicket.Drag.init(Wicket.$(dwrhid), jQuery.noop, jQuery.noop, self.onResize);
-				}
-			}
-		},
-
-		switchScrollLock: function() {
-			var self = Wicket.Ajax.DebugWindow;
-			self.scrollLock = !self.scrollLock;
-			var $link = jQuery('#'+self.debugWindowScrollLockLinkId),
-				color;
-			if (self.scrollLock) {
-				color = 'red';
-			} else {
-				color = 'blue';
-			}
-			$link.css('color', color);
-		},
-
-		onResize: function(element, deltaX, deltaY) {
-			var self = Wicket.Ajax.DebugWindow;
-
-			var $window = jQuery('#'+self.debugWindowId),
-				$log = jQuery('#'+self.debugWindowLogId);
-
-			var width = parseInt($window.css('width'), 10) + deltaX;
-			var height = parseInt($log.css('height'), 10) + deltaY;
-
-			var res = [0, 0];
-
-			if (width < 300) {
-				res[0] = 300 - width;
-				width = 300;
-			}
-
-			if (height < 100) {
-				res[1] = 100 - height;
-				height = 100;
-			}
-
-			$window.css('width', width + "px");
-			$log.css('height',  height + "px");
-
-			return res;
-		},
-
-		onDrag: function(element, deltaX, deltaY) {
-			var self = Wicket.Ajax.DebugWindow;
-			var $window = jQuery('#'+self.debugWindowId);
-
-			var x = parseInt($window.css('left'), 10) + deltaX;
-			var y = parseInt($window.css('top'), 10) + deltaY;
-
-			var res = [0, 0];
-
-			if (x < 0) {
-				res[0] = -deltaX;
-				x = 0;
-			}
-			if (y < 0) {
-				res[1] = -deltaY;
-				y = 0;
-			}
-
-			$window.css('left', x + "px");
-			$window.css('top', y + "px");
-
-			return res;
-		}
-	};
-
-	jQuery(window).on('load', Wicket.Ajax.DebugWindow.init);
-
-})();
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index 92c5ef4..7d441ea 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -225,28 +225,36 @@
 	 * Logging functionality.
 	 */
 	Wicket.Log = {
+			
+		enabled: false,
+
+		log: function (msg) {
+			if (Wicket.Log.enabled && typeof(console) !== "undefined" && typeof(console.log) === 'function') {
+				console.log('Wicket: ', msg);
+			}
+		},
 
-		enabled: function () {
-			return Wicket.Ajax.DebugWindow && Wicket.Ajax.DebugWindow.enabled;
+		debug: function (msg) {
+			if (Wicket.Log.enabled && typeof(console) !== "undefined" && typeof(console.debug) === 'function') {
+				console.debug('Wicket: ', msg);
+			}
 		},
 
 		info: function (msg) {
-			if (Wicket.Log.enabled()) {
-				Wicket.Ajax.DebugWindow.logInfo(msg);
+			if (Wicket.Log.enabled && typeof(console) !== "undefined" && typeof(console.info) === 'function') {
+				console.info('Wicket: ', msg);
 			}
 		},
 
-		error: function (msg) {
-			if (Wicket.Log.enabled()) {
-				Wicket.Ajax.DebugWindow.logError(msg);
-			} else if (typeof(console) !== "undefined" && typeof(console.error) === 'function') {
-				console.error('Wicket.Ajax: ', msg);
+		warn: function (msg) {
+			if (Wicket.Log.enabled && typeof(console) !== "undefined" && typeof(console.warn) === 'function') {
+				console.warn('Wicket: ', msg);
 			}
 		},
 
-		log: function (msg) {
-			if (Wicket.Log.enabled()) {
-				Wicket.Ajax.DebugWindow.log(msg);
+		error: function (msg) {
+			if (Wicket.Log.enabled && typeof(console) !== "undefined" && typeof(console.error) === 'function') {
+				console.error('Wicket: ', msg);
 			}
 		}
 	};
@@ -688,6 +696,9 @@
 				}
 			}
 
+			Wicket.Log.info("Executing Ajax request");
+			Wicket.Log.debug(attrs);
+
 			// execute the request
 			var jqXHR = jQuery.ajax({
 				url: url,
@@ -829,11 +840,9 @@
 				}
 				else {
 					// no redirect, just regular response
-					if (Wicket.Log.enabled()) {
-						var responseAsText = jqXHR.responseText;
-						Wicket.Log.info("Received ajax response (" + responseAsText.length + " characters)");
-						Wicket.Log.info("\n" + responseAsText);
-					}
+					var responseAsText = jqXHR.responseText;
+					Wicket.Log.info("Received ajax response (" + responseAsText.length + " characters)");
+					Wicket.Log.debug(jqXHR.responseXML);
 
 					// invoke the loaded callback with an xml document
 					return this.loadedCallback(data, context);
@@ -926,7 +935,7 @@
 		failure: function (context, jqXHR, errorMessage, textStatus) {
 			context.steps.push(jQuery.proxy(function (notify) {
 				if (errorMessage) {
-					Wicket.Log.error("Wicket.Ajax.Call.failure: Error while parsing response: " + errorMessage);
+					Wicket.Log.error("Ajax.Call.failure: Error while parsing response: " + errorMessage);
 				}
 				var attrs = context.attrs;
 				this._executeHandlers(attrs.fh, attrs, jqXHR, errorMessage, textStatus);
@@ -953,7 +962,7 @@
 				var element = Wicket.$(compId);
 
 				if (isUndef(element)) {
-					Wicket.Log.error("Wicket.Ajax.Call.processComponent: Component with id [[" +
+					Wicket.Log.error("Ajax.Call.processComponent: Component with id [[" +
 						compId + "]] was not found while trying to perform markup update. " +
 						"Make sure you called component.setOutputMarkupId(true) on the component whose markup you are trying to update.");
 				} else {
@@ -1000,7 +1009,7 @@
 						var f = window.eval(toExecute);
 						f(notify);
 					} catch (exception) {
-						log.error("Wicket.Ajax.Call.processEvaluation: Exception evaluating javascript: " + exception + ", text: " + text);
+						log.error("Ajax.Call.processEvaluation: Exception evaluating javascript: " + exception + ", text: " + text);
 					}
 					return FunctionsExecuter.ASYNC;
 				};
@@ -1013,7 +1022,7 @@
 						// do the evaluation in global scope
 						window.eval(script);
 					} catch (exception) {
-						log.error("Wicket.Ajax.Call.processEvaluation: Exception evaluating javascript: " + exception + ", text: " + text);
+						log.error("Ajax.Call.processEvaluation: Exception evaluating javascript: " + exception + ", text: " + text);
 					}
 					// continue to next step
 					return FunctionsExecuter.DONE;
@@ -1993,7 +2002,7 @@
 										document.createStyleSheet().cssText = content;
 									}
 									catch(e) {
-										Wicket.Log.error("Wicket.Head.Contributor.processStyle: " + e);
+										Wicket.Log.error("Head.Contributor.processStyle: " + e);
 									}
 									notify();
 								};
@@ -2093,7 +2102,7 @@
 									// do the evaluation in global scope
 									window.eval(text);
 								} catch (e) {
-									Wicket.Log.error("Wicket.Head.Contributor.processScript: " + e + ": eval -> " + text);
+									Wicket.Log.error("Head.Contributor.processScript: " + e + ": eval -> " + text);
 								}
 							}
 
@@ -2284,170 +2293,6 @@
 			}
 		},
 
-		/**
-		 * Flexible dragging support.
-		 */
-		Drag: {
-
-			/**
-			 * Initializes dragging on the specified element.
-			 * 
-			 * @param element {Element}
-			 *            element clicking on which
-			 *            the drag should begin
-			 * @param onDragBegin {Function}
-			 *            called at the begin of dragging - passed element and event as parameters,
-			 *            may return false to prevent the start
-			 * @param onDragEnd {Function}
-			 *            handler called at the end of dragging - passed element as parameter
-			 * @param onDrag {Function}
-			 *            handler called during dragging - passed element and mouse deltas as parameters
-			 */
-			init: function(element, onDragBegin, onDragEnd, onDrag) {
-
-				if (typeof(onDragBegin) === "undefined") {
-					onDragBegin = jQuery.noop;
-				}
-
-				if (typeof(onDragEnd) === "undefined") {
-					onDragEnd = jQuery.noop;
-				}
-
-				if (typeof(onDrag) === "undefined") {
-					onDrag = jQuery.noop;
-				}
-
-				element.wicketOnDragBegin = onDragBegin;
-				element.wicketOnDrag = onDrag;
-				element.wicketOnDragEnd = onDragEnd;
-
-
-				// set the mousedown handler
-				Wicket.Event.add(element, "mousedown", Wicket.Drag.mouseDownHandler);
-			},
-
-			mouseDownHandler: function (e) {
-				e = Wicket.Event.fix(e);
-
-				var element = this;
-
-				if (element.wicketOnDragBegin(element, e) === false) {
-					return;
-				}
-
-				if (e.preventDefault) {
-					e.preventDefault();
-				}
-
-				element.lastMouseX = e.clientX;
-				element.lastMouseY = e.clientY;
-
-				element.old_onmousemove = document.onmousemove;
-				element.old_onmouseup = document.onmouseup;
-				element.old_onselectstart = document.onselectstart;
-				element.old_onmouseout = document.onmouseout;
-
-				document.onselectstart = function () {
-					return false;
-				};
-				document.onmousemove = Wicket.Drag.mouseMove;
-				document.onmouseup = Wicket.Drag.mouseUp;
-				document.onmouseout = Wicket.Drag.mouseOut;
-
-				Wicket.Drag.current = element;
-			},
-
-			/**
-			 * Deinitializes the dragging support on given element.
-			 */
-			clean: function (element) {
-				element.onmousedown = null;
-			},
-
-			/**
-			 * Called when mouse is moved. This method fires the onDrag event
-			 * with element instance, deltaX and deltaY (the distance
-			 * between this call and the previous one).
-
-			 * The onDrag handler can optionally return an array of two integers
-			 * - the delta correction. This is used, for example, if there is
-			 * element being resized and the size limit has been reached (but the
-			 * mouse can still move).
-			 *
-			 * @param {Event} e
-			 */
-			mouseMove: function (e) {
-				e = Wicket.Event.fix(e);
-				var o = Wicket.Drag.current;
-
-				// this happens sometimes in Safari
-				if (e.clientX < 0 || e.clientY < 0) {
-					return;
-				}
-
-				if (o !== null) {
-					var deltaX = e.clientX - o.lastMouseX;
-					var deltaY = e.clientY - o.lastMouseY;
-
-					var res = o.wicketOnDrag(o, deltaX, deltaY, e);
-
-					if (isUndef(res)) {
-						res = [0, 0];
-					}
-
-					o.lastMouseX = e.clientX + res[0];
-					o.lastMouseY = e.clientY + res[1];
-				}
-
-				return false;
-			},
-
-			/**
-			 * Called when the mouse button is released.
-			 * Cleans all temporary variables and callback methods.
-			 */
-			mouseUp: function () {
-				var o = Wicket.Drag.current;
-
-				if (o) {
-					o.wicketOnDragEnd(o);
-
-					o.lastMouseX = null;
-					o.lastMouseY = null;
-
-					document.onmousemove = o.old_onmousemove;
-					document.onmouseup = o.old_onmouseup;
-					document.onselectstart = o.old_onselectstart;
-
-					document.onmouseout = o.old_onmouseout;
-
-					o.old_mousemove = null;
-					o.old_mouseup = null;
-					o.old_onselectstart = null;
-					o.old_onmouseout = null;
-
-					Wicket.Drag.current = null;
-				}
-			},
-
-			/**
-			 * Called when mouse leaves an element. We need this for firefox, as otherwise
-			 * the dragging would continue after mouse leaves the document.
-			 * Unfortunately this break dragging in firefox immediately after the mouse leaves
-			 * page.
-			 */
-			mouseOut: function (e) {
-				if (false && Wicket.Browser.isGecko()) {
-					// other browsers handle this more gracefully
-					e = Wicket.Event.fix(e);
-
-					if (e.target.tagName === "HTML") {
-						Wicket.Drag.mouseUp(e);
-					}
-				}
-			}
-		},
-
 		// FOCUS FUNCTIONS
 
 		Focus: {
diff --git a/wicket-core/src/main/java/org/apache/wicket/resource/CoreLibrariesContributor.java b/wicket-core/src/main/java/org/apache/wicket/resource/CoreLibrariesContributor.java
index 49da713..60cfabc 100644
--- a/wicket-core/src/main/java/org/apache/wicket/resource/CoreLibrariesContributor.java
+++ b/wicket-core/src/main/java/org/apache/wicket/resource/CoreLibrariesContributor.java
@@ -59,17 +59,13 @@ public class CoreLibrariesContributor
 	{
 		JavaScriptLibrarySettings jsLibrarySettings = application.getJavaScriptLibrarySettings();
 
+		ResourceReference wicketAjaxReference = jsLibrarySettings.getWicketAjaxReference();
+		response.render(JavaScriptHeaderItem.forReference(wicketAjaxReference));
+		
 		final DebugSettings debugSettings = application.getDebugSettings();
 		if (debugSettings.isAjaxDebugModeEnabled())
 		{
-			response.render(JavaScriptHeaderItem.forReference(jsLibrarySettings.getWicketAjaxDebugReference()));
-			response.render(JavaScriptHeaderItem.forScript("Wicket.Ajax.DebugWindow.enabled=true;",
-				"wicket-ajax-debug-enable"));
-		}
-		else
-		{
-			ResourceReference wicketAjaxReference = jsLibrarySettings.getWicketAjaxReference();
-			response.render(JavaScriptHeaderItem.forReference(wicketAjaxReference));
+			response.render(JavaScriptHeaderItem.forScript("Wicket.Log.enabled=true;", "wicket-ajax-debug-enable"));
 		}
 	}
 }
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/JavaScriptLibrarySettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/JavaScriptLibrarySettings.java
index 195c573..6ec43dc1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/JavaScriptLibrarySettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/JavaScriptLibrarySettings.java
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.settings;
 
-import org.apache.wicket.ajax.WicketAjaxDebugJQueryResourceReference;
 import org.apache.wicket.ajax.WicketAjaxJQueryResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.JQueryResourceReference;
@@ -40,8 +39,6 @@ public class JavaScriptLibrarySettings
 
 	private ResourceReference wicketAjaxReference = WicketAjaxJQueryResourceReference.get();
 
-	private ResourceReference wicketAjaxDebugReference = WicketAjaxDebugJQueryResourceReference.get();
-
 	/**
 	 * @return the reference to the JQuery JavaScript library used as backing library for
 	 *         wicket-event and wicket-ajax
@@ -81,26 +78,4 @@ public class JavaScriptLibrarySettings
 		this.wicketAjaxReference = Args.notNull(wicketAjaxReference, "wicketAjaxReference");
 		return this;
 	}
-
-	/**
-	 * The Wicket Ajax Debug Window.
-	 *
-	 * @return the reference to the implementation of wicket-ajax-debug.js
-	 */
-	public ResourceReference getWicketAjaxDebugReference()
-	{
-		return wicketAjaxDebugReference;
-	}
-
-	/**
-	 * @param wicketAjaxDebugReference
-	 *            a reference to the implementation of wicket-ajax-debug.js
-	 * @return {@code this} object for chaining
-	 */
-	public JavaScriptLibrarySettings setWicketAjaxDebugReference(ResourceReference wicketAjaxDebugReference)
-	{
-		this.wicketAjaxDebugReference = Args.notNull(wicketAjaxDebugReference,
-			"wicketAjaxDebugReference");
-		return this;
-	}
-}
+}
\ No newline at end of file
diff --git a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
index 2d737ec..973720e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageAjaxResult.html
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="comp1" ><![CDATA[<span wicket:id="comp" id="comp1">body</span>]]></component><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]]]><![CDATA[>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
index 837c10d..c4b5850 100644
--- a/wicket-core/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/TestDetachPageExpectedResult.html
@@ -1,10 +1,9 @@
 <html xmlns:wicket>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxBehaviorEnabled_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxBehaviorEnabled_expected.html
index cfbfd37..0d62464 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxBehaviorEnabled_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxBehaviorEnabled_expected.html
@@ -2,10 +2,9 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_expected.html
index 6bab591..f0c0400 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage2_expected.html
@@ -7,10 +7,9 @@
 
 <link href="../../test2"/>
 <script type="text/javascript" src="../../javascripturlB"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_expected.html
index 6ad9cd4..84f795a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/AjaxHeaderContributionPage_expected.html
@@ -4,10 +4,9 @@
 <script type="text/javascript" src="../../javascripturl"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html
index ecf2d89..9791e9c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_ajax_expected.html
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="test1" ><![CDATA[<a href="./org.apache.wicket.ajax.DomReadyOrderPage?0-1.-test" wicket:id="test" id="test1">Test</a>]]></component><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]]]><![CDATA[>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_expected.html
index 6ab6893..f127d71 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/DomReadyOrderPage_expected.html
@@ -1,10 +1,9 @@
 <html>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
index 1e39106..cd1987a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
@@ -1,10 +1,9 @@
 <html>
 	<head><script type="text/javascript" src="./resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="./resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="./resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
index 857d72a..e5ced2e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
@@ -1,10 +1,9 @@
 <html>
 	<head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkPageExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkPageExpectedResult.html
index b4e45cc..ce36c3b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkPageExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkPageExpectedResult.html
@@ -1,10 +1,9 @@
 <html>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkWithBorderPageExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkWithBorderPageExpectedResult.html
index 8a634dd..77e9996 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkWithBorderPageExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxLinkWithBorderPageExpectedResult.html
@@ -1,10 +1,9 @@
 <html>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxPage2_ExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxPage2_ExpectedResult.html
index bf9d782..8163e78 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxPage2_ExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/ajaxLink/AjaxPage2_ExpectedResult.html
@@ -1,10 +1,9 @@
 <html>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
index 68aa9f8..279ac72 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult-1.html
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?><ajax-response><component id="linja11" ><![CDATA[<span wicket:id="linja1" id="linja11">1</span>]]></component><header-contribution><![CDATA[<head xmlns:wicket="http://wicket.apache.org"><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]]]><![CDATA[>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
index e65d62b..6a70125 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/markup/html/componentMap/SimpleTestPageExpectedResult.html
@@ -1,10 +1,9 @@
 <html>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/DeferredPageExpected.html b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/DeferredPageExpected.html
index a0f33bf..be0f042 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/DeferredPageExpected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/DeferredPageExpected.html
@@ -1,10 +1,9 @@
 <html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
     <head><script type="text/javascript" defer="defer" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" defer="defer" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" defer="defer" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" >
 /*<![CDATA[*/
-document.addEventListener('DOMContentLoaded', function() { Wicket.Ajax.DebugWindow.enabled=true;; });
+document.addEventListener('DOMContentLoaded', function() { Wicket.Log.enabled=true;; });
 /*]]>*/
 </script>
 <script type="text/javascript" >
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
index 17213e5..28588f0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/basic/SimplePageExpectedResult_13.html
@@ -4,10 +4,9 @@
 <html wicket:id="html" xmlns:wicket="" xmlns="http://www.w3.org/1999/xhtml" xmlns:lang="[current language]" lang="de" id="html1">
   <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/HideableBorderPage_ExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/HideableBorderPage_ExpectedResult.html
index d526446..080bead 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/HideableBorderPage_ExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/HideableBorderPage_ExpectedResult.html
@@ -1,10 +1,9 @@
 <html xmlns:wicket>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_7.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_7.html
index 92b45a7..365ba0f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_7.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_7.html
@@ -1,10 +1,9 @@
 <html xmlns:wicket>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_8.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_8.html
index 8d73eb8..34ad3cc9 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_8.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/panel/InlinePanelPageExpectedResult_8.html
@@ -1,10 +1,9 @@
 <html xmlns:wicket>
 <head><script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js"></script>
 <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js"></script>
-<script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery-debug.js"></script>
 <script type="text/javascript" id="wicket-ajax-debug-enable">
 /*<![CDATA[*/
-Wicket.Ajax.DebugWindow.enabled=true;
+Wicket.Log.enabled=true;
 /*]]>*/
 </script>
 <script type="text/javascript" id="wicket-ajax-base-url">
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java
index 21b4cf5..825d92a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java
@@ -82,7 +82,7 @@ class CachingResourceStreamLocatorTest
 		Locale locale = null;
 		String extension = null;
 
-		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js";
+		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js";
 
 		// a strict lookup for the resource with no specific locale results in a match
 		IResourceStream strictLocate = cachingLocator.locate(AbstractDefaultAjaxBehavior.class,
@@ -113,7 +113,7 @@ class CachingResourceStreamLocatorTest
 		Locale locale = new Locale("nl", "NL");
 		String extension = null;
 
-		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js";
+		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js";
 
 		// a strict lookup of a localized resource should not find the non-localized resource
 		IResourceStream strictLocate = cachingLocator.locate(AbstractDefaultAjaxBehavior.class,
@@ -143,7 +143,7 @@ class CachingResourceStreamLocatorTest
 		Locale locale = new Locale("nl", "NL");
 		String extension = null;
 
-		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js";
+		String filename = "org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js";
 
 		// a non-strict lookup with a specific locale should find the non-localized resource
 		IResourceStream nonStrictLocate = cachingLocator.locate(AbstractDefaultAjaxBehavior.class,
diff --git a/wicket-core/src/test/js/ajax.js b/wicket-core/src/test/js/ajax.js
index 3863f2b..95078ea 100644
--- a/wicket-core/src/test/js/ajax.js
+++ b/wicket-core/src/test/js/ajax.js
@@ -151,7 +151,7 @@ jQuery(document).ready(function() {
 			var oldWicketLogError = Wicket.Log.error;
 
 			Wicket.Log.error = function(msg) {
-				equal(msg, 'Wicket.Ajax.Call.processComponent: Component with id [[componentToReplaceDoesNotExist]] was not found while trying to perform markup update. Make sure you called component.setOutputMarkupId(true) on the component whose markup you are trying to update.');
+				equal(msg, 'Ajax.Call.processComponent: Component with id [[componentToReplaceDoesNotExist]] was not found while trying to perform markup update. Make sure you called component.setOutputMarkupId(true) on the component whose markup you are trying to update.');
 
 				// restore the original method
 				Wicket.Log.error = oldWicketLogError;
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.html b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.html
index f6db5d2..0ff4fdf 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.html
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.html
@@ -21,10 +21,10 @@
 <body>
  
 	<wicket:panel>
-		<a id="wicketDebugBarCollapse" onclick="wicketDebugBarCollapse();"><img wicket:id="logo" src="wicket.png" alt="Wicket" /></a>
+		<a id="wicketDebugBarCollapse"><img wicket:id="logo" src="wicket.png" alt="Wicket" /></a>
 		<span id="wicketDebugBarContents" wicket:id="content">
 			<span wicket:id="contributors"><span wicket:id="contrib" class="contributor"></span></span>
-			<a id="wicketDebugBarRemove" onclick="wicketDebugBarRemove();"><img wicket:id="removeImg" src="remove.png" alt="Remove" /></a>
+			<a id="wicketDebugBarRemove"><img wicket:id="removeImg" src="remove.png" alt="Remove" /></a>
 		</span>
 	</wicket:panel>
 
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.java b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.java
index c1f6a69..8c9e1c6 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.java
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/DebugBar.java
@@ -36,6 +36,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.resource.CoreLibrariesContributor;
 import org.apache.wicket.util.lang.Args;
 
 /**
@@ -177,11 +178,13 @@ public class DebugBar extends DevUtilsPanel
 	@Override
 	public void renderHead(final IHeaderResponse response)
 	{
+		CoreLibrariesContributor.contributeAjax(getApplication(), response);
+		
 		response.render(CssHeaderItem.forReference(new CssResourceReference(DebugBar.class,
 			"wicket-debugbar.css")));
 		response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(
 			DebugBar.class, "wicket-debugbar.js")));
-		response.render(OnDomReadyHeaderItem.forScript("wicketDebugBarCheckState()"));
+		response.render(OnDomReadyHeaderItem.forScript("Wicket.debugBar();"));
 	}
 
 	/**
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.css b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.css
index b5cb09a..282835b 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.css
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.css
@@ -55,14 +55,17 @@
 	so that if there is an error, we can simply change 
 	the class and it will use the error colors instead.
 */
-.wicketDebugBarError {
-	background-color: red;
-	opacity: 0.8;
-}
 .wicketDebugBar {
 	background-color: #DDDDDD;
 	opacity: 0.8;
 }
+.wicketDebugBarError {
+	animation: wicketDebugBarFlicker 1s;
+}
+@keyframes wicketDebugBarFlicker {
+	25%, 75% {background-color: red;}
+	0%, 50%, 100% {background-color: #DDDDDD;}	
+}
 
 #wicketDebugBarCollapse {
 	cursor: pointer;
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.js b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.js
index 443c286..c87ec8a 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.js
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/debugbar/wicket-debugbar.js
@@ -14,57 +14,69 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-function wicketDebugBarCollapse() {
-	wicketDebugBarToggleVisibility('wicketDebugBarContents');
-}
+;(function (jQuery, undefined) {
 
-function wicketDebugBarRemove() {
-	wicketDebugBarToggleVisibility('wicketDebugBar');
-}
+	'use strict';
 
-function wicketDebugBarToggleVisibility(elemID) {
-	var elem = document.getElementById(elemID);
-	var vis  = elem.style.display != 'none';
-	elem.style.display = (vis ? 'none' : '');
-    // alter the state cookie so we can initialize it properly on domReady
-	wicketDebugBarSetExpandedCookie(vis ? 'collapsed' : 'expanded')
-}
+	if (typeof(Wicket) === 'undefined') {
+		window.Wicket = {};
+	}
 
-function wicketDebugBarSetExpandedCookie(value) {
-	document.cookie =  "wicketDebugBarState=" + window.escape(value);
-}
+	if (typeof(Wicket.debugBar) === 'object') {
+		return;
+	}
 
-function wicketDebugBarGetExpandedCookie() {
-	var name = 'wicketDebugBarState';
-	if (document.cookie.length > 0) {
-		var start = document.cookie.indexOf (name + "=");
-		if (start !== -1) {
-			start = start + name.length + 1;
-			var end = document.cookie.indexOf(";", start);
-			if (end === -1) {
-				end = document.cookie.length;
+	Wicket.debugBar = function() {
+		
+		function setExpandedCookie(value) {
+			document.cookie =  "wicketDebugBarState=" + window.escape(value);
+		}
+		
+		function getExpandedCookie() {
+			var name = 'wicketDebugBarState';
+			if (document.cookie.length > 0) {
+				var start = document.cookie.indexOf (name + "=");
+				if (start !== -1) {
+					start = start + name.length + 1;
+					var end = document.cookie.indexOf(";", start);
+					if (end === -1) {
+						end = document.cookie.length;
+					}
+					return window.unescape(document.cookie.substring(start,end));
+				} else {
+					return null;
+				}
+			} else {
+				return null;
 			}
-			return window.unescape(document.cookie.substring(start,end));
-		} else {
-			return null;
 		}
-	} else {
-		return null;
-	}
-}
 
-function wicketDebugBarCheckState() {
-	var state = wicketDebugBarGetExpandedCookie();
-    // state cookie has not been set. determine state and set it
-	if (state === null) {
-		var isVisible = jQuery('#wicketDebugBarContents').is(':visible');
-		wicketDebugBarSetExpandedCookie(isVisible ? 'expanded' : 'collapsed');
-    // set state of debug bar according to cookie
-	} else {
-		if (state === 'expanded') {
-			jQuery('#wicketDebugBarContents').css('display', '');
-		} else {
-			jQuery('#wicketDebugBarContents').css('display', 'none');
+		jQuery('#wicketDebugBarCollapse').on("click", function() {
+			var content = jQuery('#wicketDebugBarContents');
+			setExpandedCookie(!content.is(':visible'));
+			content.toggle(400);
+		});
+
+		jQuery('#wicketDebugBarRemove').on("click", function() {
+			var bar = jQuery('#wicketDebugBar');
+			setExpandedCookie(!bar.is(':visible'));
+			bar.hide();
+		});
+
+	    // determine state and set it
+		if (getExpandedCookie() === 'false') {
+			jQuery('#wicketDebugBarContents').hide();
 		}
-	}
-}
+		
+		var original = Wicket.Log.error;
+		Wicket.Log.error = function(msg) {
+			original(msg);
+			
+			jQuery('#wicketDebugBar')
+				.addClass('wicketDebugBarError')
+				.one('animationend', function() {
+					jQuery(this).removeClass('wicketDebugBarError');
+				});
+		};
+	};
+})(jQuery);
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
index 82caa41..b43828e 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxApplication.java
@@ -42,8 +42,6 @@ public class AjaxApplication extends WicketExampleApplication
 
 		getRequestCycleSettings().addResponseFilter(new AjaxServerAndClientTimeFilter());
 
-		getDebugSettings().setAjaxDebugModeEnabled(true);
-		
 		getComponentInitializationListeners().add(new IComponentInitializationListener()
 		{
 			@Override
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js
index b4293c5..d5800e0 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js
@@ -1548,4 +1548,168 @@
 		}
 	};
 
+	/**
+	 * Flexible dragging support.
+	 */
+	Wicket.Drag = {
+
+		/**
+		 * Initializes dragging on the specified element.
+		 * 
+		 * @param element {Element}
+		 *            element clicking on which
+		 *            the drag should begin
+		 * @param onDragBegin {Function}
+		 *            called at the begin of dragging - passed element and event as parameters,
+		 *            may return false to prevent the start
+		 * @param onDragEnd {Function}
+		 *            handler called at the end of dragging - passed element as parameter
+		 * @param onDrag {Function}
+		 *            handler called during dragging - passed element and mouse deltas as parameters
+		 */
+		init: function(element, onDragBegin, onDragEnd, onDrag) {
+
+			if (typeof(onDragBegin) === "undefined") {
+				onDragBegin = jQuery.noop;
+			}
+
+			if (typeof(onDragEnd) === "undefined") {
+				onDragEnd = jQuery.noop;
+			}
+
+			if (typeof(onDrag) === "undefined") {
+				onDrag = jQuery.noop;
+			}
+
+			element.wicketOnDragBegin = onDragBegin;
+			element.wicketOnDrag = onDrag;
+			element.wicketOnDragEnd = onDragEnd;
+
+
+			// set the mousedown handler
+			Wicket.Event.add(element, "mousedown", Wicket.Drag.mouseDownHandler);
+		},
+
+		mouseDownHandler: function (e) {
+			e = Wicket.Event.fix(e);
+
+			var element = this;
+
+			if (element.wicketOnDragBegin(element, e) === false) {
+				return;
+			}
+
+			if (e.preventDefault) {
+				e.preventDefault();
+			}
+
+			element.lastMouseX = e.clientX;
+			element.lastMouseY = e.clientY;
+
+			element.old_onmousemove = document.onmousemove;
+			element.old_onmouseup = document.onmouseup;
+			element.old_onselectstart = document.onselectstart;
+			element.old_onmouseout = document.onmouseout;
+
+			document.onselectstart = function () {
+				return false;
+			};
+			document.onmousemove = Wicket.Drag.mouseMove;
+			document.onmouseup = Wicket.Drag.mouseUp;
+			document.onmouseout = Wicket.Drag.mouseOut;
+
+			Wicket.Drag.current = element;
+		},
+
+		/**
+		 * Deinitializes the dragging support on given element.
+		 */
+		clean: function (element) {
+			element.onmousedown = null;
+		},
+
+		/**
+		 * Called when mouse is moved. This method fires the onDrag event
+		 * with element instance, deltaX and deltaY (the distance
+		 * between this call and the previous one).
+
+		 * The onDrag handler can optionally return an array of two integers
+		 * - the delta correction. This is used, for example, if there is
+		 * element being resized and the size limit has been reached (but the
+		 * mouse can still move).
+		 *
+		 * @param {Event} e
+		 */
+		mouseMove: function (e) {
+			e = Wicket.Event.fix(e);
+			var o = Wicket.Drag.current;
+
+			// this happens sometimes in Safari
+			if (e.clientX < 0 || e.clientY < 0) {
+				return;
+			}
+
+			if (o !== null) {
+				var deltaX = e.clientX - o.lastMouseX;
+				var deltaY = e.clientY - o.lastMouseY;
+
+				var res = o.wicketOnDrag(o, deltaX, deltaY, e);
+
+				if (res !== "undefined") {
+					res = [0, 0];
+				}
+
+				o.lastMouseX = e.clientX + res[0];
+				o.lastMouseY = e.clientY + res[1];
+			}
+
+			return false;
+		},
+
+		/**
+		 * Called when the mouse button is released.
+		 * Cleans all temporary variables and callback methods.
+		 */
+		mouseUp: function () {
+			var o = Wicket.Drag.current;
+
+			if (o) {
+				o.wicketOnDragEnd(o);
+
+				o.lastMouseX = null;
+				o.lastMouseY = null;
+
+				document.onmousemove = o.old_onmousemove;
+				document.onmouseup = o.old_onmouseup;
+				document.onselectstart = o.old_onselectstart;
+
+				document.onmouseout = o.old_onmouseout;
+
+				o.old_mousemove = null;
+				o.old_mouseup = null;
+				o.old_onselectstart = null;
+				o.old_onmouseout = null;
+
+				Wicket.Drag.current = null;
+			}
+		},
+
+		/**
+		 * Called when mouse leaves an element. We need this for firefox, as otherwise
+		 * the dragging would continue after mouse leaves the document.
+		 * Unfortunately this break dragging in firefox immediately after the mouse leaves
+		 * page.
+		 */
+		mouseOut: function (e) {
+			if (false && Wicket.Browser.isGecko()) {
+				// other browsers handle this more gracefully
+				e = Wicket.Event.fix(e);
+
+				if (e.target.tagName === "HTML") {
+					Wicket.Drag.mouseUp(e);
+				}
+			}
+		}
+	};
+	
 })();