You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/07/03 10:13:07 UTC

[4/4] WICKET-4635 Improve JavaScript files by applying common JSHint rules

http://git-wip-us.apache.org/repos/asf/wicket/blob/95481df2/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js
----------------------------------------------------------------------
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 a3556c6..60bfc5a 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
@@ -21,1664 +21,1672 @@
  * @author Matej Knopp
  */
 
-/**
- * In case wicket-ajax.js is not yet loaded, create 
- * Wicket namespace and Wicket.Class.create. 
- */  
-if (typeof(Wicket) == "undefined") {
-	Wicket = { };
-}
+;(function (undefined) {
+	'use strict';
 
+	/**
+	 * In case wicket-ajax.js is not yet loaded, create
+	 * Wicket namespace and Wicket.Class.create.
+	 */
+	if (typeof(Wicket) === "undefined") {
+		window.Wicket = {};
+	}
 
-if (Wicket.Class == null) {
-	Wicket.Class = {
-		create: function() {
-			return function() {
-				this.initialize.apply(this, arguments);
+	if (!Wicket.Class) {
+		Wicket.Class = {
+			create: function() {
+				return function() {
+					this.initialize.apply(this, arguments);
+				};
 			}
-		}
-	};
-}
+		};
+	}
 
-if (Wicket.Object == null) {
-	Wicket.Object = { };
-}
+	if (!Wicket.Object) {
+		Wicket.Object = { };
+	}
 
-if (Wicket.Object.extend == null) {
-	Wicket.Object.extend = function(destination, source) {
-		for (property in source) {
-			destination[property] = source[property];
-		}
-		return destination;
+	if (!Wicket.Object.extend) {
+		Wicket.Object.extend = function(destination, source) {
+			for (var property in source) {
+				destination[property] = source[property];
+			}
+			return destination;
+		};
 	}
-}
 
-/**
- * Supporting code for getting mouse move and mouse up events from iframes.
- * The problem when dragging a div with an iframe is that when the mouse cursor
- * gets over an iframe, all mouse events are received by the iframe's document. (IE and FF)
- * 
- * This code can recursively traverse all iframes in document and temporarily forward
- * events from their documents to parent document. 
- */ 
-Wicket.Iframe = { 
-	
 	/**
-	 * Returns the horizontal position of given element (in pixels).
+	 * Supporting code for getting mouse move and mouse up events from iframes.
+	 * The problem when dragging a div with an iframe is that when the mouse cursor
+	 * gets over an iframe, all mouse events are received by the iframe's document. (IE and FF)
+	 *
+	 * This code can recursively traverse all iframes in document and temporarily forward
+	 * events from their documents to parent document.
 	 */
-	findPosX: function(e) { 
-		if (e.offsetParent) {
-			var c = 0;
-			while (e) {
-				c += e.offsetLeft
-				e = e.offsetParent;
-			}
-			return c;
-		} else if (e.x) {
-			return e.x;
-		} else {
-			return 0;
-		}	
-	},
+	Wicket.Iframe = {
+
+		/**
+		 * Returns the horizontal position of given element (in pixels).
+		 */
+		findPosX: function(e) {
+			if (e.offsetParent) {
+				var c = 0;
+				while (e) {
+					c += e.offsetLeft;
+					e = e.offsetParent;
+				}
+				return c;
+			} else if (e.x) {
+				return e.x;
+			} else {
+				return 0;
+			}
+		},
+
+		/**
+		 * Returns the vertical position of given element (in pixels).
+		 */
+		findPosY: function(e) {
+			if (e.offsetParent) {
+				var c = 0;
+				while (e) {
+					c += e.offsetTop;
+					e = e.offsetParent;
+				}
+				return c;
+			} else if (e.y) {
+				return e.y;
+			} else {
+				return 0;
+			}
+		},
+
+		/**
+		 * Forwards the events from iframe to the parent document (works recursively).
+		 * @param {Document} doc - document to which the events will be forwarded
+		 * @param {HTMLElement} iframe - source iframe
+		 * @param {Array} revertList - list to which altered iframes will be added
+		 */
+		forwardEvents: function(doc, iframe, revertList) {
+			try {
+				var idoc = iframe.contentWindow.document;
+				idoc.old_onmousemove = idoc.onmousemove;
+				idoc.onmousemove = function(evt) {
+					if (!evt) {
+						evt = iframe.contentWindow.event;
+					}
+					var e = {};
 
-	/**
-	 * Returns the vertical position of given element (in pixels).
-	 */	
-	findPosY: function(e) {
-		if (e.offsetParent) {
-			var c = 0;
-			while (e) {
-				c += e.offsetTop
-				e = e.offsetParent;
-			}
-			return c;
-		} else if (e.y) {
-			return e.y;
-		} else {
-			return 0;
-		}				
-	},
+					var dx = 0;
+					var dy = 0;
+					if (Wicket.Browser.isIE() || Wicket.Browser.isGecko) {
+						dx = Wicket.Window.getScrollX();
+						dy = Wicket.Window.getScrollY();
+					}
 
-	/**
-	 * Forwards the events from iframe to the parent document (works recursively).
-	 * @param {Document} doc - document to which the events will be forwarded   
-	 * @param {HTMLElement} iframe - source iframe 
-	 * @param {Array} revertList - list to which altered iframes will be added 
-	 */
-	forwardEvents: function(doc, iframe, revertList) {
-		try {
+					e.clientX = evt.clientX + Wicket.Iframe.findPosX(iframe) - dx;
+					e.clientY = evt.clientY + Wicket.Iframe.findPosY(iframe) - dy;
+					doc.onmousemove(e);
+				};
+				idoc.old_onmouseup = idoc.old_onmousemove;
+				idoc.onmouseup = function(evt) {
+					if (!evt) {
+						evt = iframe.contentWindow.event;
+					}
+					var e = {};
+
+					var dx = 0;
+					var dy = 0;
+					if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
+						dx = Wicket.Window.getScrollX();
+						dy = Wicket.Window.getScrollY();
+					}
+
+					e.clientX = evt.clientX + Wicket.Iframe.findPosX(iframe) - dx;
+					e.clientY = evt.clientY + Wicket.Iframe.findPosY(iframe) - dy;
+					doc.onmouseup(e);
+				};
+				revertList.push(iframe);
+				Wicket.Iframe.documentFix(idoc, revertList);
+			} catch (ignore) {
+			}
+		},
+
+		/**
+		 * Reverts the changes made to the given iframe.
+		 * @param {HTMLElement} iframe
+		 */
+		revertForward: function(iframe) {
 			var idoc = iframe.contentWindow.document;
-			idoc.old_onmousemove = idoc.onmousemove;
-			idoc.onmousemove = function(evt) {
-				if (evt == null)
-					evt = iframe.contentWindow.event;
-				var e = new Object();						
-				
-				var dx = 0;
-				var dy = 0;				
-				if (Wicket.Browser.isIE() || Wicket.Browser.isGecko) {
-					dx = Wicket.Window.getScrollX();
-					dy = Wicket.Window.getScrollY();
-				}
-										
-				e.clientX = evt.clientX + Wicket.Iframe.findPosX(iframe) - dx;
-				e.clientY = evt.clientY + Wicket.Iframe.findPosY(iframe) - dy;		
-				doc.onmousemove(e);			
-			}	
-			idoc.old_onmouseup = idoc.old_onmousemove;
-			idoc.onmouseup = function(evt) {
-				if (evt == null)
-					evt = iframe.contentWindow.event;
-				var e = new Object();
-
-				var dx = 0;
-				var dy = 0;				
-				if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
-					dx = Wicket.Window.getScrollX();
-					dy = Wicket.Window.getScrollY();
+			idoc.onmousemove = idoc.old_onmousemove;
+			idoc.onmouseup = idoc.old_onmouseup;
+			idoc.old_onmousemove = null;
+			idoc.old_onmouseup = null;
+		},
+
+		/**
+		 * Forward events from all iframes of the given document (recursive)
+		 * @param {Document} doc - document to be fixed
+		 * @param {Array} revertList - all affected iframes will be stored here
+		 */
+		documentFix: function(doc, revertList) {
+			var iframes = doc.getElementsByTagName("iframe");
+			for (var i = 0; i < iframes.length; ++i) {
+				var iframe = iframes[i];
+				if (iframe.tagName) {
+					Wicket.Iframe.forwardEvents(doc, iframe, revertList);
 				}
-				
-				e.clientX = evt.clientX + Wicket.Iframe.findPosX(iframe) - dx;
-				e.clientY = evt.clientY + Wicket.Iframe.findPosY(iframe) - dy;			
-				doc.onmouseup(e);	
-			}	
-			revertList.push(iframe);
-			Wicket.Iframe.documentFix(idoc, revertList);
-		} catch (ignore) {
-		}		
-	},
+			}
+		},
+
+		/**
+		 * Reverts the changes made to each iframe in the given array.
+		 * @param {Array} revertList
+		 */
+		documentRevert: function(revertList) {
+			for (var i = 0; i < revertList.length; ++i) {
+				var iframe = revertList[i];
+				Wicket.Iframe.revertForward(iframe);
+			}
+		}
+	};
 
 	/**
-	 * Reverts the changes made to the given iframe.
-	 * @param {HTMLElement} iframe
+	 * Draggable (and optionally resizable) window that can either hold a div
+	 * or an iframe.
 	 */
-	revertForward: function(iframe) {
-		var idoc = iframe.contentWindow.document;
-		idoc.onmousemove = idoc.old_onmousemove;
-		idoc.onmouseup = idoc.old_onmouseup;
-		idoc.old_onmousemove = null;
-		idoc.old_onmouseup = null;
-	},
+	Wicket.Window = Wicket.Class.create();
 
 	/**
-	 * Forward events from all iframes of the given document (recursive)
-	 * @param {Document} doc - document to be fixed
-	 * @param {Array} revertList - all affected iframes will be stored here
+	 * Display confirmation dialog if the user is about to leave a page (IE and FF).
+	 * @deprecated Use the settings instead. TODO Remove for/after Wicket 7.0
 	 */
-	documentFix: function(doc, revertList) {
-		var iframes = doc.getElementsByTagName("iframe");	
-		for (var i = 0; i < iframes.length; ++i) {
-			var iframe = iframes[i];		
-			if (iframe.tagName != null)					
-				Wicket.Iframe.forwardEvents(doc, iframe, revertList);		
-		}
-	},
+	Wicket.Window.unloadConfirmation = true;
 
 	/**
-	 * Reverts the changes made to each iframe in the given array.
-	 * @param {Array} revertList
+	 * Creates a wicket window instance. The advantage of using this is
+	 * that in case an iframe modal window is opened in an already displayed
+	 * iframe modal window, the new window is created as a top-level window.
+	 *
 	 */
-	documentRevert: function(revertList) {
-		for (var i = 0; i < revertList.length; ++i) {
-			var iframe = revertList[i];
-			Wicket.Iframe.revertForward(iframe);
+	Wicket.Window.create = function(settings) {
+		var Win;
+
+		// if it is an iframe window...
+		if (typeof(settings.src) !== "undefined" && Wicket.Browser.isKHTML() === false) {
+			// attempt to get class from parent
+			try {
+				Win = window.parent.Wicket.Window;
+			} catch (ignore) {}
 		}
-	}	
-}
 
-/**
- * Draggable (and optionally resizable) window that can either hold a div
- * or an iframe. 
- */
-Wicket.Window = Wicket.Class.create();
+		// no parent...
+		if (typeof(Win) === "undefined") {
+			Win = Wicket.Window;
+		}
 
-/**
- * Display confirmation dialog if the user is about to leave a page (IE and FF).
- * @deprecated Use the settings instead. TODO Remove for/after Wicket 7.0
- */
-Wicket.Window.unloadConfirmation = true;
+		// create and return instance
+		return new Win(settings);
+	};
 
-/**
- * Creates a wicket window instance. The advantage of using this is
- * that in case an iframe modal window is opened in an already displayed 
- * iframe modal window, the new window is created as a top-level window.
- * 
- */
-Wicket.Window.create = function(settings) {
-	var win;
-	
-	// if it is an iframe window...
-	if (typeof(settings.src) != "undefined" && Wicket.Browser.isKHTML() == false) {
-		// attempt to get class from parent
-		try {		
-			win = window.parent.Wicket.Window;			
-		} catch (ignore) {		
+	/**
+	 * Returns the current top level window (null if none).
+	 */
+	Wicket.Window.get = function() {
+		var win = null;
+
+		if (typeof(Wicket.Window.current) !== "undefined") {
+			win = Wicket.Window.current;
+		} else {
+			try {
+				win = window.parent.Wicket.Window.current;
+			} catch (ignore) {}
 		}
-	}
+		return win;
+	};
 
-	// no parent...
-	if (typeof(win) == "undefined") {
-		win = Wicket.Window;
-	}
-	
-	// create and return instance
-	return new win(settings);
-}
 
-/**
- * Returns the current top level window (null if none).
- */
-Wicket.Window.get = function() {
-	var win = null;
-	
-	if (typeof(Wicket.Window.current) != "undefined") {
-		win = Wicket.Window.current;
-	} else 
-	{
+	/**
+	 * Closes the current open window. This method is supposed to
+	 * be called from inside the window (therefore it checks window.parent).
+	 */
+	Wicket.Window.close = function() {
+
+		var win;
 		try {
-			win = window.parent.Wicket.Window.current;
-		} catch (ignore) {
+			win = window.parent.Wicket.Window;
+		} catch (ignore) {}
+
+		if (typeof(win) !== "undefined" && typeof(win.current) !== "undefined") {
+			// we can't call close directly, because it will delete our window,
+			// so we will schedule it as timeout for parent's window
+			window.parent.setTimeout(function() {
+				win.current.close();
+			}, 0);
 		}
-	}
-	return win;
-} 
+	};
 
+	Wicket.Window.prototype = {
 
-/**
- * Closes the current open window. This method is supposed to 
- * be called from inside the window (therefore it checks window.parent).
- */
-Wicket.Window.close = function() {
-	
-	var win;
-	try {		
-		win = window.parent.Wicket.Window;
-	} catch (ignore) {		
-	}
-	
-	if (typeof(win) != "undefined" && typeof(win.current) != "undefined") {
-		// we can't call close directly, because it will delete our window,
-		// so we will schedule it as timeout for parent's window
-		window.parent.setTimeout(function() {
-			win.current.close();			
-		}, 0);
-	}
-}
+		/**
+		 * Creates a new window instance.
+		 * Note:
+		 *   Width refers to the width of entire window (including frame).
+		 *   Height refers to the height of user content.
+		 *
+		 * @param {Object} settings - map that contains window settings. the default
+		 *                            values are below - together with description
+		 */
+		initialize: function(settings) {
 
-Wicket.Window.prototype = { 
+			// override default settings with user settings
+			this.settings = Wicket.Object.extend({
 
-	/**
-	 * Creates a new window instance.
-	 * Note:
-	 *   Width refers to the width of entire window (including frame).
-	 *   Height refers to the height of user content. 
-	 * 
-	 * @param {Object} settings - map that contains window settings. the default
-	 *                            values are below - together with description
-	 */
-	initialize: function(settings) {
-				
-		// override default settings with user settings
-		this.settings = Wicket.Object.extend({
-			
-			minWidth: 200,  /* valid only if resizable */
-			minHeight: 150, /* valid only if resizable */
-			
-			className: "w_blue", /* w_silver */
-			
-			width: 600,  /* initial width */
-			height: 300, /* may be null for non-iframe, non-resizable window (automatic height) */
-			
-			resizable: true,
-			
-			widthUnit: "px", /* valid only if not resizable */
-			heightUnit: "px", /* valid only if not resizable */
-		
-			src: null,     /* iframe src - this takes precedence over the "element" property */
-			element: null, /* content element (for non-iframe window) */
-			
-			iframeName: null, /* name of the iframe */				
-		
-			cookieId: null, /* id of position (and size if resizable) cookie */
-		
-			title: null, /* window title. if null and window content is iframe, title of iframe document will be used. */
-		
-			onCloseButton: Wicket.bind(function() {				
-				/* On firefox on Linux, at least, we need to blur() textfields, etc.
-				 * to get it to update its DOM model. Otherwise you'll lose any changes
-				 * made to the current form component you're editing.
-				 */ 
-				this.caption.getElementsByTagName("a")[0].focus();
-				this.caption.getElementsByTagName("a")[0].blur();
-				this.close();
-				return false;
-			}, this), /* called when close button is clicked */
-			
-			onClose: function() { }, /* called when window is closed */
-		
-			mask: "semi-transparent" /* or "transparent" */
-			
-		}, settings || { });
-		
-	},
-		
-	
-	/**
-	 * Returns true if the window is iframe-based.
-	 */
-	isIframe: function() {
-		return this.settings.src != null;
-	},
-	
-	/**
-	 * Creates the DOM elements of the window.
-	 */
-	createDOM: function() {
-		var idWindow = this.newId();
-		var idClassElement = this.newId();
-		var idCaption = this.newId();
-		var idFrame = this.newId();
-		var idTop = this.newId();
-		var idTopLeft = this.newId();
-		var idTopRight = this.newId();
-		var idLeft = this.newId();
-		var idRight = this.newId();
-		var idBottomLeft = this.newId();
-		var idBottomRight = this.newId();
-		var idBottom = this.newId();
-		var idCaptionText = this.newId();
-		
-		var markup = Wicket.Window.getMarkup(idWindow, idClassElement, idCaption, idFrame, 
-		             idTop, idTopLeft, idTopRight, idLeft, idRight, idBottomLeft, idBottomRight, 
-					 idBottom, idCaptionText, this.isIframe());								
-		
-		var element = document.createElement("div");
-		element.id = idWindow;
-		document.body.appendChild(element);		
-		Wicket.DOM.replace(element, markup);
-				
-		var _ = function(name) { return document.getElementById(name); }
-		
-		this.window = _(idWindow);
-		this.classElement = _(idClassElement);			
-		this.caption = _(idCaption);
-		this.content = _(idFrame);
-		this.top = _(idTop);
-		this.topLeft = _(idTopLeft);
-		this.topRight = _(idTopRight);
-		this.left = _(idLeft);
-		this.right = _(idRight);
-		this.bottomLeft = _(idBottomLeft);
-		this.bottomRight = _(idBottomRight);	
-		this.bottom = _(idBottom);
-		this.captionText = _(idCaptionText);
-				
-		if (Wicket.Browser.isIE()) {
-			// IE stupid 3px bug - not fixed even in IE7 quirks!
-			if (Wicket.Browser.isIE7() == false || Wicket.Browser.isIEQuirks()) {
-				this.topLeft.style.marginRight = "-3px";
-				this.topRight.style.marginLeft = "-3px";
-				this.bottomLeft.style.marginRight = "-3px";
-				this.bottomRight.style.marginLeft = "-3px";
-			}								
-		} 			
-		
-		// HACK - IE doesn't support position:fixed. Gecko does, however for a reason
-		// we need to have background position: absolute, which makes the movement of 
-		// the window really jerky if the window stays position: fixed
-		if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
-			this.window.style.position = "absolute";
-		}
-		
-		// fix the cursors
-		if (this.settings.resizable == false) {
-			this.top.style.cursor =  this.topLeft.style.cursor = this.topRight.style.cursor =
-			this.bottom.style.cursor = this.bottomLeft.style.cursor = this.bottomRight.style.cursor = 
-			this.left.style.cursor = this.right.style.cursor = "default";
-		}				
-	},
+				minWidth: 200,  /* valid only if resizable */
+				minHeight: 150, /* valid only if resizable */
 
-	/**
-	 * Creates the new unique id for window element.
-	 */ 
-	newId: function() {
-		return "_wicket_window_" + Wicket.Window.idCounter++;
-	},
-	
-	
-	/**
-	 * Binds the handler to the drag event on given element.
-	 */
-	bind: function(element, handler) {
-		Wicket.Drag.init(element, Wicket.bind(this.onBegin, this), Wicket.bind(this.onEnd, this), Wicket.bind(handler, this)); 
-	},
+				className: "w_blue", /* w_silver */
 
-	/**
-	 * Unbinds the handler from a drag event on given element.
-	 */	
-	unbind: function(element) {
-		Wicket.Drag.clean(element);
-	},
-	
-	/**
-	 * Binds the event handlers to the elements.
-	 */
-	bindInit: function() {
-		this.bind(this.caption, this.onMove);
-		
-		if (this.settings.resizable) {		
-			this.bind(this.bottomRight, this.onResizeBottomRight);
-			this.bind(this.bottomLeft, this.onResizeBottomLeft);
-			this.bind(this.bottom, this.onResizeBottom);
-			this.bind(this.left, this.onResizeLeft);
-			this.bind(this.right, this.onResizeRight);
-			this.bind(this.topLeft, this.onResizeTopLeft);		
-			this.bind(this.topRight, this.onResizeTopRight);
-			this.bind(this.top, this.onResizeTop);
-		} else {
-			this.bind(this.bottomRight, this.onMove);
-			this.bind(this.bottomLeft, this.onMove);
-			this.bind(this.bottom, this.onMove);
-			this.bind(this.left, this.onMove);
-			this.bind(this.right, this.onMove);
-			this.bind(this.topLeft, this.onMove);		
-			this.bind(this.topRight, this.onMove);
-			this.bind(this.top, this.onMove);
-		}	
-				
-		this.caption.getElementsByTagName("a")[0].onclick = Wicket.bind(this.settings.onCloseButton, this);
-	},
+				width: 600,  /* initial width */
+				height: 300, /* may be null for non-iframe, non-resizable window (automatic height) */
 
-	/**
-	 * Unbinds the event handlers.
-	 */
-	bindClean: function() {				
-		this.unbind(this.caption);
-		this.unbind(this.bottomRight);
-		this.unbind(this.bottomLeft);
-		this.unbind(this.bottom);
-		this.unbind(this.left);
-		this.unbind(this.right);
-		this.unbind(this.topLeft);		
-		this.unbind(this.topRight);
-		this.unbind(this.top);
-		
-		this.caption.getElementsByTagName("a")[0].onclick = null;
-	},
-	
-	/**
-	 * Returns the content document
-	 */
-	getContentDocument: function() {
-		if (this.isIframe() == true) {
-			return this.content.contentWindow.document;
-		} else {
-			return document;
-		}
-	},
+				resizable: true,
 
-	/**
-	 * Places the window to the center of the viewport.
-	 */	
-	center: function() {
-		var scTop = 0;
-		var scLeft = 0;
-
-		if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) 	{
-			scLeft = Wicket.Window.getScrollX();
-			scTop = Wicket.Window.getScrollY();
-		}
-		
-		var width = Wicket.Window.getViewportWidth();
-		var height = Wicket.Window.getViewportHeight();
-		
-		var modalWidth = this.window.offsetWidth;
-		var modalHeight = this.window.offsetHeight;
-		
-		if (modalWidth > width - 10) { 
-			this.window.style.width = (width - 10) + "px"; 
-			modalWidth = this.window.offsetWidth; 
-		} 
-		if (modalHeight > height - 40) { 
-			this.content.style.height = (height - 40) + "px"; 
-			modalHeight = this.window.offsetHeight; 
-		} 
-		
-		var left = (width / 2) - (modalWidth / 2) + scLeft;
-		var top = (height / 2) - (modalHeight / 2) + scTop;
-		if (left < 0) left = 0;
-		if (top < 0) top = 0;
-		
-		this.window.style.left = left + "px";
-		this.window.style.top = top + "px";
-	},
-	
-	cookieKey: "wicket-modal-window-positions",
-	cookieExp: 31,
-	
-	findPositionString: function(remove) {
-		var cookie = Wicket.Cookie.get(this.cookieKey);
-	
-		var entries = cookie != null ? cookie.split("|") : new Array();
-		
-		for (var i = 0; i < entries.length; ++i) {
-			if (entries[i].indexOf(this.settings.cookieId + "::") == 0) {
-				var string = entries[i];
-				if (remove) {
-					entries.splice(i, 1);					
-					Wicket.Cookie.set(this.cookieKey, entries.join("|"), this.cookieExp);
-										
+				widthUnit: "px", /* valid only if not resizable */
+				heightUnit: "px", /* valid only if not resizable */
+
+				src: null,     /* iframe src - this takes precedence over the "element" property */
+				element: null, /* content element (for non-iframe window) */
+
+				iframeName: null, /* name of the iframe */
+
+				cookieId: null, /* id of position (and size if resizable) cookie */
+
+				title: null, /* window title. if null and window content is iframe, title of iframe document will be used. */
+
+				onCloseButton: Wicket.bind(function() {
+					/* On firefox on Linux, at least, we need to blur() textfields, etc.
+					 * to get it to update its DOM model. Otherwise you'll lose any changes
+					 * made to the current form component you're editing.
+					 */
+					this.caption.getElementsByTagName("a")[0].focus();
+					this.caption.getElementsByTagName("a")[0].blur();
+					this.close();
+					return false;
+				}, this), /* called when close button is clicked */
+
+				onClose: function() { }, /* called when window is closed */
+
+				mask: "semi-transparent" /* or "transparent" */
+
+			}, settings || { });
+
+		},
+
+		/**
+		 * Returns true if the window is iframe-based.
+		 */
+		isIframe: function() {
+			return this.settings.src != null;
+		},
+
+		/**
+		 * Creates the DOM elements of the window.
+		 */
+		createDOM: function() {
+			var idWindow = this.newId();
+			var idClassElement = this.newId();
+			var idCaption = this.newId();
+			var idFrame = this.newId();
+			var idTop = this.newId();
+			var idTopLeft = this.newId();
+			var idTopRight = this.newId();
+			var idLeft = this.newId();
+			var idRight = this.newId();
+			var idBottomLeft = this.newId();
+			var idBottomRight = this.newId();
+			var idBottom = this.newId();
+			var idCaptionText = this.newId();
+
+			var markup = Wicket.Window.getMarkup(idWindow, idClassElement, idCaption, idFrame,
+					idTop, idTopLeft, idTopRight, idLeft, idRight, idBottomLeft, idBottomRight,
+					idBottom, idCaptionText, this.isIframe());
+
+			var element = document.createElement("div");
+			element.id = idWindow;
+			document.body.appendChild(element);
+			Wicket.DOM.replace(element, markup);
+
+			var _ = function(name) { return document.getElementById(name); };
+
+			this.window = _(idWindow);
+			this.classElement = _(idClassElement);
+			this.caption = _(idCaption);
+			this.content = _(idFrame);
+			this.top = _(idTop);
+			this.topLeft = _(idTopLeft);
+			this.topRight = _(idTopRight);
+			this.left = _(idLeft);
+			this.right = _(idRight);
+			this.bottomLeft = _(idBottomLeft);
+			this.bottomRight = _(idBottomRight);
+			this.bottom = _(idBottom);
+			this.captionText = _(idCaptionText);
+
+			if (Wicket.Browser.isIE()) {
+				// IE stupid 3px bug - not fixed even in IE7 quirks!
+				if (Wicket.Browser.isIE7() === false || Wicket.Browser.isIEQuirks()) {
+					this.topLeft.style.marginRight = "-3px";
+					this.topRight.style.marginLeft = "-3px";
+					this.bottomLeft.style.marginRight = "-3px";
+					this.bottomRight.style.marginLeft = "-3px";
 				}
-				return string;
 			}
-		}
-		return null;
-	},
-	
-	/**
-	 * Saves the position (and size if resizable) as a cookie.
-	 */
-	savePosition: function() {
-	   this.savePositionAs(this.window.style.left, this.window.style.top, this.window.style.width, this.content.style.height);
-	},
-	
-	savePositionAs: function(x, y, width, height) {
-		if (typeof(this.settings.cookieId) != "undefined" &&  this.settings.cookieId != null) {
-	
-			this.findPositionString(true);
-			
-			if (cookie == null || cookie.length == 0)
-				cookie = "";
-			else
-				cookie = cookie + "|";
-			
-			var cookie = this.settings.cookieId;
-			cookie += "::";
-			
-			cookie += x + ",";
-			cookie += y + ",";
-			cookie += width + ",";
-			cookie += height;
-					
-			var rest = Wicket.Cookie.get(this.cookieKey);
-			if (rest != null) {
-				cookie += "|" + rest;
-			}
-			Wicket.Cookie.set(this.cookieKey, cookie, this.cookieExp);
-			
-		};
-	},
-	
-	/**
-	 * Restores the position (and size if resizable) from the cookie.
-	 */
-	loadPosition: function() {
-		if (typeof(this.settings.cookieId) != "undefined" && this.settings.cookieId != null) {
-			
-			var string = this.findPositionString(false);
-			
-			if (string != null) {
-				var array = string.split("::");
-				var positions = array[1].split(",");
-				if (positions.length == 4) {					
-					this.window.style.left = positions[0];
-					this.window.style.top = positions[1];
-					this.window.style.width = positions[2];
-					this.content.style.height = positions[3];
+
+			// HACK - IE doesn't support position:fixed. Gecko does, however for a reason
+			// we need to have background position: absolute, which makes the movement of
+			// the window really jerky if the window stays position: fixed
+			if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
+				this.window.style.position = "absolute";
+			}
+
+			// fix the cursors
+			if (this.settings.resizable === false) {
+				this.top.style.cursor =  this.topLeft.style.cursor = this.topRight.style.cursor =
+				this.bottom.style.cursor = this.bottomLeft.style.cursor = this.bottomRight.style.cursor =
+				this.left.style.cursor = this.right.style.cursor = "default";
+			}
+		},
+
+		/**
+		 * Creates the new unique id for window element.
+		 */
+		newId: function() {
+			return "_wicket_window_" + Wicket.Window.idCounter++;
+		},
+
+		/**
+		 * Binds the handler to the drag event on given element.
+		 */
+		bind: function(element, handler) {
+			Wicket.Drag.init(element, Wicket.bind(this.onBegin, this), Wicket.bind(this.onEnd, this), Wicket.bind(handler, this));
+		},
+
+		/**
+		 * Unbinds the handler from a drag event on given element.
+		 */
+		unbind: function(element) {
+			Wicket.Drag.clean(element);
+		},
+
+		/**
+		 * Binds the event handlers to the elements.
+		 */
+		bindInit: function() {
+			this.bind(this.caption, this.onMove);
+
+			if (this.settings.resizable) {
+				this.bind(this.bottomRight, this.onResizeBottomRight);
+				this.bind(this.bottomLeft, this.onResizeBottomLeft);
+				this.bind(this.bottom, this.onResizeBottom);
+				this.bind(this.left, this.onResizeLeft);
+				this.bind(this.right, this.onResizeRight);
+				this.bind(this.topLeft, this.onResizeTopLeft);
+				this.bind(this.topRight, this.onResizeTopRight);
+				this.bind(this.top, this.onResizeTop);
+			} else {
+				this.bind(this.bottomRight, this.onMove);
+				this.bind(this.bottomLeft, this.onMove);
+				this.bind(this.bottom, this.onMove);
+				this.bind(this.left, this.onMove);
+				this.bind(this.right, this.onMove);
+				this.bind(this.topLeft, this.onMove);
+				this.bind(this.topRight, this.onMove);
+				this.bind(this.top, this.onMove);
+			}
+
+			this.caption.getElementsByTagName("a")[0].onclick = Wicket.bind(this.settings.onCloseButton, this);
+		},
+
+		/**
+		 * Unbinds the event handlers.
+		 */
+		bindClean: function() {
+			this.unbind(this.caption);
+			this.unbind(this.bottomRight);
+			this.unbind(this.bottomLeft);
+			this.unbind(this.bottom);
+			this.unbind(this.left);
+			this.unbind(this.right);
+			this.unbind(this.topLeft);
+			this.unbind(this.topRight);
+			this.unbind(this.top);
+
+			this.caption.getElementsByTagName("a")[0].onclick = null;
+		},
+
+		/**
+		 * Returns the content document
+		 */
+		getContentDocument: function() {
+			if (this.isIframe() === true) {
+				return this.content.contentWindow.document;
+			} else {
+				return document;
+			}
+		},
+
+		/**
+		 * Places the window to the center of the viewport.
+		 */
+		center: function() {
+			var scTop = 0;
+			var scLeft = 0;
+
+			if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
+				scLeft = Wicket.Window.getScrollX();
+				scTop = Wicket.Window.getScrollY();
+			}
+
+			var width = Wicket.Window.getViewportWidth();
+			var height = Wicket.Window.getViewportHeight();
+
+			var modalWidth = this.window.offsetWidth;
+			var modalHeight = this.window.offsetHeight;
+
+			if (modalWidth > width - 10) {
+				this.window.style.width = (width - 10) + "px";
+				modalWidth = this.window.offsetWidth;
+			}
+			if (modalHeight > height - 40) {
+				this.content.style.height = (height - 40) + "px";
+				modalHeight = this.window.offsetHeight;
+			}
+
+			var left = (width / 2) - (modalWidth / 2) + scLeft;
+			var top = (height / 2) - (modalHeight / 2) + scTop;
+			if (left < 0) {
+				left = 0;
+			}
+			if (top < 0) {
+				top = 0;
+			}
+
+			this.window.style.left = left + "px";
+			this.window.style.top = top + "px";
+		},
+
+		cookieKey: "wicket-modal-window-positions",
+		cookieExp: 31,
+
+		findPositionString: function(remove) {
+			var cookie = Wicket.Cookie.get(this.cookieKey);
+
+			var entries = cookie != null ? cookie.split("|") : [];
+
+			for (var i = 0; i < entries.length; ++i) {
+				if (entries[i].indexOf(this.settings.cookieId + "::") === 0) {
+					var string = entries[i];
+					if (remove) {
+						entries.splice(i, 1);
+						Wicket.Cookie.set(this.cookieKey, entries.join("|"), this.cookieExp);
+					}
+					return string;
 				}
 			}
-		}
-	},
-	
-	
-	/**
-	 * Creates the mask accordingly to the settings.
-	 */
-	createMask: function() {
-		if (this.settings.mask == "transparent")
-			this.mask = new Wicket.Window.Mask(true);
-		else if (this.settings.mask == "semi-transparent")
-			this.mask = new Wicket.Window.Mask(false);
-						
-		if (typeof(this.mask) != "undefined") {
-			this.mask.show();
-		}		
-	},
-	
-	/**
-	 * Destroys the mask.
-	 */
-	destroyMask: function() {
-		this.mask.hide();	
-		this.mask = null;
-	},
-	
-	/**
-	 * Loads the content 
-	 */
-	load: function() {
-		if (this.settings.title == null)
-			this.update = window.setInterval(Wicket.bind(this.updateTitle, this), 100);
-		
-		// opera seems to have problem accessing contentWindow here
-		if (Wicket.Browser.isOpera()) {
-			this.content.onload = Wicket.bind(function() {
+			return null;
+		},
+
+		/**
+		 * Saves the position (and size if resizable) as a cookie.
+		 */
+		savePosition: function() {
+			this.savePositionAs(this.window.style.left, this.window.style.top, this.window.style.width, this.content.style.height);
+		},
+
+		savePositionAs: function(x, y, width, height) {
+			if (this.settings.cookieId) {
+
+				this.findPositionString(true);
+
+//				if (!cookie || cookie.length === 0) {
+//					cookie = "";
+//				} else {
+//					cookie = cookie + "|";
+//				}
+				var cookie = this.settings.cookieId;
+				cookie += "::";
+
+				cookie += x + ",";
+				cookie += y + ",";
+				cookie += width + ",";
+				cookie += height;
+
+				var rest = Wicket.Cookie.get(this.cookieKey);
+				if (rest != null) {
+					cookie += "|" + rest;
+				}
+				Wicket.Cookie.set(this.cookieKey, cookie, this.cookieExp);
+			}
+		},
+
+		/**
+		 * Restores the position (and size if resizable) from the cookie.
+		 */
+		loadPosition: function() {
+			if (this.settings.cookieId) {
+
+				var string = this.findPositionString(false);
+
+				if (string != null) {
+					var array = string.split("::");
+					var positions = array[1].split(",");
+					if (positions.length === 4) {
+						this.window.style.left = positions[0];
+						this.window.style.top = positions[1];
+						this.window.style.width = positions[2];
+						this.content.style.height = positions[3];
+					}
+				}
+			}
+		},
+
+		/**
+		 * Creates the mask accordingly to the settings.
+		 */
+		createMask: function() {
+			if (this.settings.mask === "transparent") {
+				this.mask = new Wicket.Window.Mask(true);
+			} else if (this.settings.mask === "semi-transparent") {
+				this.mask = new Wicket.Window.Mask(false);
+			}
+			if (typeof(this.mask) !== "undefined") {
+				this.mask.show();
+			}
+		},
+
+		/**
+		 * Destroys the mask.
+		 */
+		destroyMask: function() {
+			this.mask.hide();
+			this.mask = null;
+		},
+
+		/**
+		 * Loads the content
+		 */
+		load: function() {
+			if (!this.settings.title) {
+				this.update = window.setInterval(Wicket.bind(this.updateTitle, this), 100);
+			}
+
+			// opera seems to have problem accessing contentWindow here
+			if (Wicket.Browser.isOpera()) {
+				this.content.onload = Wicket.bind(function() {
+					this.content.contentWindow.name = this.settings.iframeName;
+				}, this);
+			} else {
 				this.content.contentWindow.name = this.settings.iframeName;
-			}, this);
-		} else {
-			this.content.contentWindow.name = this.settings.iframeName;
-		}
-		
-		try
-		{
-			if(Wicket.Browser.isIELessThan9()){
-				this.content.contentWindow.location.replace(this.settings.ie8_src);
-			}else{
-				this.content.contentWindow.location.replace(this.settings.src);
 			}
-		}
-		catch(ignore)
-		{
-			this.content.src = this.settings.src;
-		}		
-	},
-	
-	/**
-	 * Shows the window. 
-	 */
-	show: function() {					
-		
-		// create the DOM elements
-		this.createDOM();
-		
-		// set the class of window (blue or silver by default)
-		this.classElement.className = this.settings.className;
-		
-		// is it an iframe window?
-		if (this.isIframe()) {
-			// load the file
-			this.load();
-		} else {
-			// it's an element content
-			
-			// is the element specified?
-			if (this.settings.element == null) {
-				throw "Either src or element must be set.";
-			}
-			
-			// reparent the element
-			this.oldParent = this.settings.element.parentNode;
-			this.settings.element.parentNode.removeChild(this.settings.element);
-			this.content.appendChild(this.settings.element);
-			
-			// set the overflow style so that scrollbars are shown when the element is bigger than window
-			this.content.style.overflow="auto";
-		}
-		
-		// bind the events
-		this.bindInit();
-
-		// if the title is specified set it
-		if (this.settings.title != null) {
-			this.captionText.innerHTML = this.settings.title;
-			// http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby
-			this.window.setAttribute('aria-labelledBy', this.settings.title);
-		}
 
-		// initial width and height
-		this.window.style.width = this.settings.width + (this.settings.resizable ? "px" : this.settings.widthUnit);
-		
-		if (this.settings.height != null)
-			this.content.style.height = this.settings.height + (this.settings.resizable ? "px" : this.settings.heightUnit);
-		
-		//if 'auto' flag was set to true call autoresize function
-		if (this.settings.autoSize)
-			this.autoSizeWindow();		
-
-		// center the window
-		this.center();
-		
-		// load position from cookie
-		this.loadPosition();
-
-		var doShow = Wicket.bind(function() {
-			this.adjustOpenWindowZIndexesOnShow();
-			this.window.style.visibility="visible";
-			
-		}, this);
-				
-		this.adjustOpenWindowsStatusOnShow();
-
-		// show the window
-		if (false && Wicket.Browser.isGecko() && this.isIframe()) {
-			// HACK
-			// gecko flickers when showing the window
-			// unless the showing is postponed a little
-			window.setTimeout(function() { doShow(); }, 0);
-		} else {
-			doShow();
-		}
+			try
+			{
+				if(Wicket.Browser.isIELessThan9()){
+					this.content.contentWindow.location.replace(this.settings.ie8_src);
+				}else{
+					this.content.contentWindow.location.replace(this.settings.src);
+				}
+			}
+			catch(ignore)
+			{
+				this.content.src = this.settings.src;
+			}
+		},
 
-		// if the content supports focus and blur it, which means
-		// that the already focused element will lose it's focus
-		if (this.content.focus) {
-			this.content.focus();
-			this.content.blur();
-		}
-		// preserve old unload hanler
-		this.old_onunload = window.onunload;
-		
-		// new unload handler - close the window to prevent memory leaks in ie
-		window.onunload = Wicket.bind(function() {
-			this.close(true);
-			if (this.old_onunload != null)
-				return this.old_onunload();
-		}, this);
-		
-		// preserve old beforeunload handler
-		this.old_onbeforeunload = window.onbeforeunload;
-
-		// Wicket.Window.unloadConfirmation is deprecated but we need to check it
-		// for backward compatibility. Remove it after Wicket 7.0
-		if (this.settings.unloadConfirmation && Wicket.Window.unloadConfirmation) {
-			// new beforeunload handler - ask user before reloading window
-			window.onbeforeunload = function() {
-				return "Reloading this page will cause the modal window to disappear.";
+		/**
+		 * Shows the window.
+		 */
+		show: function() {
+
+			// create the DOM elements
+			this.createDOM();
+
+			// set the class of window (blue or silver by default)
+			this.classElement.className = this.settings.className;
+
+			// is it an iframe window?
+			if (this.isIframe()) {
+				// load the file
+				this.load();
+			} else {
+				// it's an element content
+
+				// is the element specified?
+				if (this.settings.element == null) {
+					throw "Either src or element must be set.";
+				}
+
+				// reparent the element
+				this.oldParent = this.settings.element.parentNode;
+				this.settings.element.parentNode.removeChild(this.settings.element);
+				this.content.appendChild(this.settings.element);
+
+				// set the overflow style so that scrollbars are shown when the element is bigger than window
+				this.content.style.overflow="auto";
 			}
-		}
-		
-		// create the mask that covers the background
-		this.createMask();
-	},
-	
-	adjustOpenWindowZIndexesOnShow: function() {
-		// if there is a previous window
-		if ((this.oldWindow != null) && (typeof(this.oldWindow) != "undefined")) {
-			// lower it's z-index so that it's moved under the mask
-			this.oldWindow.window.style.zIndex = Wicket.Window.Mask.zIndex - 1;
-		}
-	},
-	
-	adjustOpenWindowsStatusOnShow: function() {
-		// is there a window displayed already?
-		if (Wicket.Window.current != null) {
-			// save the reference to it
-			this.oldWindow = Wicket.Window.current;
-		}
-		// keep reference to this window
-		Wicket.Window.current = this;
-	},
-	
-	/**
-	 * Returns true if the window can be closed.
-	 */
-	canClose: function() {
-		return true;
-	},
-	
-	/**
-	 * Prevent user from closing the window if there's another (nested) modal window in the iframe. 
-	 */
-	canCloseInternal: function() {
-		try {
-			if (this.isIframe() == true) {
-				var current = this.content.contentWindow.Wicket.Window.current;
-				if (typeof(current) != "undefined" && current != null) {
-					alert('You can\'t close this modal window. Close the top-level modal window first.');
-					return false;
+
+			// bind the events
+			this.bindInit();
+
+			// if the title is specified set it
+			if (this.settings.title != null) {
+				this.captionText.innerHTML = this.settings.title;
+				// http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby
+				this.window.setAttribute('aria-labelledBy', this.settings.title);
+			}
+
+			// initial width and height
+			this.window.style.width = this.settings.width + (this.settings.resizable ? "px" : this.settings.widthUnit);
+
+			if (this.settings.height) {
+				this.content.style.height = this.settings.height + (this.settings.resizable ? "px" : this.settings.heightUnit);
+			}
+
+			//if 'auto' flag was set to true call autoresize function
+			if (this.settings.autoSize) {
+				this.autoSizeWindow();
+			}
+
+			// center the window
+			this.center();
+
+			// load position from cookie
+			this.loadPosition();
+
+			var doShow = Wicket.bind(function() {
+				this.adjustOpenWindowZIndexesOnShow();
+				this.window.style.visibility="visible";
+
+			}, this);
+
+			this.adjustOpenWindowsStatusOnShow();
+
+			// show the window
+			if (false && Wicket.Browser.isGecko() && this.isIframe()) {
+				// HACK
+				// gecko flickers when showing the window
+				// unless the showing is postponed a little
+				window.setTimeout(function() { doShow(); }, 0);
+			} else {
+				doShow();
+			}
+
+			// if the content supports focus and blur it, which means
+			// that the already focused element will lose it's focus
+			if (this.content.focus) {
+				this.content.focus();
+				this.content.blur();
+			}
+			// preserve old unload hanler
+			this.old_onunload = window.onunload;
+
+			// new unload handler - close the window to prevent memory leaks in ie
+			window.onunload = Wicket.bind(function() {
+				this.close(true);
+				if (this.old_onunload) {
+					return this.old_onunload();
 				}
+			}, this);
+
+			// preserve old beforeunload handler
+			this.old_onbeforeunload = window.onbeforeunload;
+
+			// Wicket.Window.unloadConfirmation is deprecated but we need to check it
+			// for backward compatibility. Remove it after Wicket 7.0
+			if (this.settings.unloadConfirmation && Wicket.Window.unloadConfirmation) {
+				// new beforeunload handler - ask user before reloading window
+				window.onbeforeunload = function() {
+					return "Reloading this page will cause the modal window to disappear.";
+				};
 			}
-		} catch (ignore) {
-		}
-		return true;
-	},
-	
-	/**
-	 * Closes the window.
-	 * @param {Boolean} force - internal argument 
-	 */
-	close: function(force) {
-							
-		// can user close the window?
-		if (force != true && (!this.canClose() || !this.canCloseInternal()))
-			return;		
-		
-		// if the update handler was set clean it
-		if (typeof(this.update) != "undefined")
-			window.clearInterval(this.update);
-
-		// clean event bindings
-		this.bindClean();
-		
-		// hide elements
-		this.window.style.display = "none";		
-		
-		// if the window has a div content, the div is reparented to it's old parent 
-		if (typeof(this.oldParent) != "undefined") {		
-			try {	
-				this.content.removeChild(this.settings.element);
-				this.oldParent.appendChild(this.settings.element);
-				this.oldParent = null;
-			} catch (ignore) {
+
+			// create the mask that covers the background
+			this.createMask();
+		},
+
+		adjustOpenWindowZIndexesOnShow: function() {
+			// if there is a previous window
+			if (this.oldWindow) {
+				// lower it's z-index so that it's moved under the mask
+				this.oldWindow.window.style.zIndex = Wicket.Window.Mask.zIndex - 1;
 			}
-		}
-		
-		// remove the elements from document
-		this.window.parentNode.removeChild(this.window);
-		
-		// clean references to elements
-		this.window = this.classElement = this.caption = this.bottomLeft = this.bottomRight = this.bottom =
-		this.left = this.right = this.topLeft = this.topRight = this.top = this.captionText = null;
-					
-		// restore old unload handler					
-		window.onunload = this.old_onunload;
-		this.old_onunload = null;			
-		
-		// restore old beforeunload handler
-		window.onbeforeunload = this.old_onbeforeunload;
-		this.old_onbeforeunload = null;
-		
-		// hids and cleanup the mask
-		this.destroyMask();
-		
-		if (force != true) {
-			// call onclose handler
-			this.settings.onClose();
-		}
+		},
 
-		this.adjustOpenWindowsStatusAndZIndexesOnClose();
-		
-		if (Wicket.Browser.isIE()) {
-			// There's a strange focus problem in IE that disables focus on entire page,
-			// unless something focuses an input
-			var e = document.createElement("input");
-			var x = Wicket.Window.getScrollX();
-			var y = Wicket.Window.getScrollY();
-			e.style.position = "absolute";
-			e.style.left = x + "px";
-			e.style.top = y + "px";
-			document.body.appendChild(e);
-			e.focus();
-			document.body.removeChild(e);
-		}						
-	},
-	
-	adjustOpenWindowsStatusAndZIndexesOnClose: function() {
-		// if there was a window shown before this one
-		if (this.oldWindow != null) {
-			// set the old as current
-			Wicket.Window.current = this.oldWindow;
-			// increase it's z-index so that it's moved above the mask
-			Wicket.Window.current.window.style.zIndex = Wicket.Window.Mask.zIndex + 1;
-			this.oldWindow = null; 
-		} else {
-			// remove reference to the window
-			Wicket.Window.current = null;
-		}
-	},
-	
-	/**
-	 * Cleans the internal state of the window
-	 */
-	destroy: function() {
-		this.settings = null;
-	},
-	
-		
-	/**
-	 * If the window is Iframe, updates the title with iframe's document title.
-	 */
-	updateTitle: function() {		
-		try {			
-			if (this.content.contentWindow.document.title != null) {
-				if (this.captionText.innerHTML != this.content.contentWindow.document.title) {													
-					this.captionText.innerHTML = this.content.contentWindow.document.title;
-					// http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby
-					this.window.setAttribute('aria-labelledBy', this.content.contentWindow.document.title);
-					
-					// konqueror doesn't refresh caption text properly
-					if (Wicket.Browser.isKHTML()) {
-						this.captionText.style.display = 'none';
-						window.setTimeout(Wicket.bind(function() { this.captionText.style.display="block";}, this), 0);
+		adjustOpenWindowsStatusOnShow: function() {
+			// is there a window displayed already?
+			if (Wicket.Window.current) {
+				// save the reference to it
+				this.oldWindow = Wicket.Window.current;
+			}
+			// keep reference to this window
+			Wicket.Window.current = this;
+		},
+
+		/**
+		 * Returns true if the window can be closed.
+		 */
+		canClose: function() {
+			return true;
+		},
+
+		/**
+		 * Prevent user from closing the window if there's another (nested) modal window in the iframe.
+		 */
+		canCloseInternal: function() {
+			try {
+				if (this.isIframe() === true) {
+					var current = this.content.contentWindow.Wicket.Window.current;
+					if (current) {
+						window.alert('You can\'t close this modal window. Close the top-level modal window first.');
+						return false;
 					}
+				}
+			} catch (ignore) {}
+			return true;
+		},
+
+		/**
+		 * Closes the window.
+		 * @param {Boolean} force - internal argument
+		 */
+		close: function(force) {
+
+			// can user close the window?
+			if (force !== true && (!this.canClose() || !this.canCloseInternal())) {
+				return;
+			}
+
+			// if the update handler was set clean it
+			if (typeof(this.update) !== "undefined") {
+				window.clearInterval(this.update);
+			}
+
+			// clean event bindings
+			this.bindClean();
+
+			// hide elements
+			this.window.style.display = "none";
+
+			// if the window has a div content, the div is reparented to it's old parent
+			if (typeof(this.oldParent) !== "undefined") {
+				try {
+					this.content.removeChild(this.settings.element);
+					this.oldParent.appendChild(this.settings.element);
+					this.oldParent = null;
+				} catch (ignore) {}
+			}
+
+			// remove the elements from document
+			this.window.parentNode.removeChild(this.window);
+
+			// clean references to elements
+			this.window = this.classElement = this.caption = this.bottomLeft = this.bottomRight = this.bottom =
+			this.left = this.right = this.topLeft = this.topRight = this.top = this.captionText = null;
+
+			// restore old unload handler
+			window.onunload = this.old_onunload;
+			this.old_onunload = null;
+
+			// restore old beforeunload handler
+			window.onbeforeunload = this.old_onbeforeunload;
+			this.old_onbeforeunload = null;
 
+			// hids and cleanup the mask
+			this.destroyMask();
+
+			if (force !== true) {
+				// call onclose handler
+				this.settings.onClose();
+			}
+
+			this.adjustOpenWindowsStatusAndZIndexesOnClose();
+
+			if (Wicket.Browser.isIE()) {
+				// There's a strange focus problem in IE that disables focus on entire page,
+				// unless something focuses an input
+				var e = document.createElement("input");
+				var x = Wicket.Window.getScrollX();
+				var y = Wicket.Window.getScrollY();
+				e.style.position = "absolute";
+				e.style.left = x + "px";
+				e.style.top = y + "px";
+				document.body.appendChild(e);
+				e.focus();
+				document.body.removeChild(e);
+			}
+		},
+
+		adjustOpenWindowsStatusAndZIndexesOnClose: function() {
+			// if there was a window shown before this one
+			if (this.oldWindow != null) {
+				// set the old as current
+				Wicket.Window.current = this.oldWindow;
+				// increase it's z-index so that it's moved above the mask
+				Wicket.Window.current.window.style.zIndex = Wicket.Window.Mask.zIndex + 1;
+				this.oldWindow = null;
+			} else {
+				// remove reference to the window
+				Wicket.Window.current = null;
+			}
+		},
+
+		/**
+		 * Cleans the internal state of the window
+		 */
+		destroy: function() {
+			this.settings = null;
+		},
+
+		/**
+		 * If the window is Iframe, updates the title with iframe's document title.
+		 */
+		updateTitle: function() {
+			try {
+				if (this.content.contentWindow.document.title) {
+					if (this.captionText.innerHTML !== this.content.contentWindow.document.title) {
+						this.captionText.innerHTML = this.content.contentWindow.document.title;
+						// http://www.w3.org/TR/wai-aria/states_and_properties#aria-labelledby
+						this.window.setAttribute('aria-labelledBy', this.content.contentWindow.document.title);
+
+						// konqueror doesn't refresh caption text properly
+						if (Wicket.Browser.isKHTML()) {
+							this.captionText.style.display = 'none';
+							window.setTimeout(Wicket.bind(function() { this.captionText.style.display="block";}, this), 0);
+						}
+
+					}
 				}
+			} catch (ignore) {
+					Wicket.Log.info(ignore);
+			}
+		},
+
+		/**
+		 * Called when dragging has started.
+		 */
+		onBegin: function(object) {
+			if (this.isIframe() && (Wicket.Browser.isGecko() || Wicket.Browser.isIE() || Wicket.Browser.isSafari())) {
+				this.revertList = [];
+				Wicket.Iframe.documentFix(document, this.revertList);
+			}
+		},
+
+		/**
+		 * Called when dragging has ended.
+		 */
+		onEnd: function(object) {
+			if (this.revertList) {
+				Wicket.Iframe.documentRevert(this.revertList);
+				this.revertList = null;
+				if (Wicket.Browser.isKHTML() || this.content.style.visibility==='hidden') {
+					this.content.style.visibility='hidden';
+					window.setTimeout(Wicket.bind(function() { this.content.style.visibility='visible'; }, this),  0 );
+				}
+				this.revertList = null;
 			}
-		} catch (ignore) {
-				Wicket.Log.info(ignore);
-		}
-	},
 
+			this.savePosition();
+		},
 
-	/**
-	 * Called when dragging has started. 
-	 */
-	onBegin: function(object) {
-		if (this.isIframe() && (Wicket.Browser.isGecko() || Wicket.Browser.isIE() || Wicket.Browser.isSafari())) {
-			this.revertList = new Array();				
-			Wicket.Iframe.documentFix(document, this.revertList);
-		}			 			 			
-	},
-	
-	/**
-	 * Called when dragging has ended.
-	 */
-	onEnd: function(object) {
-		if (typeof(this.revertList) != "undefined" && this.revertList != null) {
-			Wicket.Iframe.documentRevert(this.revertList); 
-			this.revertList = null;
-			if (Wicket.Browser.isKHTML() || this.content.style.visibility=='hidden') {			
-				this.content.style.visibility='hidden';
-				window.setTimeout(Wicket.bind(function() { this.content.style.visibility='visible'; }, this),  0 );
-			}
-			this.revertList = null;
-		}
-						
-		this.savePosition();
-	},
+		/**
+		 * Called when window is moving (draggin the caption).
+		 */
+		onMove: function(object, deltaX, deltaY) {
+			var w = this.window;
+			this.left_ = parseInt(w.style.left, 10) + deltaX;
+			this.top_ = parseInt(w.style.top, 10) + deltaY;
 
-	/**
-	 * Called when window is moving (draggin the caption).	 
-	 */	
-	onMove: function(object, deltaX, deltaY) {
-		var w = this.window;
-		this.left_ = parseInt(w.style.left, 10) + deltaX;
-		this.top_ = parseInt(w.style.top, 10) + deltaY;
-		
-		if (this.left_ < 0) {
-			this.left_ = 0;
+			if (this.left_ < 0) {
+				this.left_ = 0;
+			}
+
+			if (this.top_ < 0) {
+				this.top_ = 0;
+			}
+
+			w.style.left = this.left_ + "px";
+			w.style.top = this.top_ + "px";
+
+			this.moving();
+		},
+
+		/**
+		 * Called when window is being moved
+		 */
+		moving: function() {
+		},
+
+		/**
+		 * Called when window is resizing.
+		 */
+		resizing: function() {
+		},
+
+		/**
+		 * Ensures that the size of window is not smaller than minimal size.
+		 */
+		clipSize : function(swapX, swapY) {
+			this.res = [0, 0];
+
+			if (this.width < this.settings.minWidth) {
+				this.left_ -= this.settings.minWidth - this.width;
+				this.res[0] = this.settings.minWidth - this.width;
+				this.width = this.settings.minWidth;
+			}
+
+			if (this.height < this.settings.minHeight) {
+				this.top_ -= this.settings.minHeight - this.height;
+				this.res[1] = this.settings.minHeight - this.height;
+				this.height = this.settings.minHeight;
+			}
+
+			if (swapX === true) {
+				this.res[0] = -this.res[0];
+			}
+			if (swapY === true) {
+				this.res[1] = -this.res[1];
+			}
+		},
+
+		//
+		// These methods are handlers for parts of window frame
+		//
+
+		onResizeBottomRight: function(object, deltaX, deltaY) {
+			var w = this.window;
+			var f = this.content;
+
+			this.width = parseInt(w.style.width, 10) + deltaX;
+			this.height = parseInt(f.style.height, 10) + deltaY;
+
+			this.clipSize();
+
+			w.style.width = this.width + "px";
+			f.style.height = this.height + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeBottomLeft: function(object, deltaX, deltaY) {
+			var w = this.window;
+			var f = this.content;
+
+			this.width = parseInt(w.style.width, 10) - deltaX;
+			this.height = parseInt(f.style.height, 10) + deltaY;
+			this.left_ = parseInt(w.style.left, 10) + deltaX;
+
+			this.clipSize(true);
+
+			w.style.width = this.width + "px";
+			w.style.left = this.left_ + "px";
+			f.style.height = this.height  + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeBottom: function(object, deltaX, deltaY) {
+			var f = this.content;
+			this.height = parseInt(f.style.height, 10) + deltaY;
+
+			this.clipSize();
+
+			f.style.height = this.height + "px";
+
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeLeft: function(object, deltaX, deltaY) {
+			var w = this.window;
+
+			this.width = parseInt(w.style.width, 10) - deltaX;
+			this.left_ = parseInt(w.style.left, 10) + deltaX;
+
+			this.clipSize(true);
+
+			w.style.width = this.width + "px";
+			w.style.left = this.left_ + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeRight: function(object, deltaX, deltaY) {
+			var w = this.window;
+
+			this.width = parseInt(w.style.width, 10) + deltaX;
+
+			this.clipSize();
+
+			w.style.width = this.width + "px";
+
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeTopLeft: function(object, deltaX, deltaY) {
+			var w = this.window;
+			var f = this.content;
+
+			this.width = parseInt(w.style.width, 10) - deltaX;
+			this.height = parseInt(f.style.height, 10) - deltaY;
+			this.left_ = parseInt(w.style.left, 10) + deltaX;
+			this.top_ =  parseInt(w.style.top, 10) + deltaY;
+
+			this.clipSize(true, true);
+
+			w.style.width = this.width + "px";
+			w.style.left = this.left_ + "px";
+			f.style.height = this.height  + "px";
+			w.style.top = this.top_ + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeTopRight: function(object, deltaX, deltaY) {
+			var w = this.window;
+			var f = this.content;
+
+			this.width = parseInt(w.style.width, 10) + deltaX;
+			this.height = parseInt(f.style.height, 10) - deltaY;
+			this.top_ = parseInt(w.style.top, 10) + deltaY;
+
+			this.clipSize(false, true);
+
+			w.style.width = this.width + "px";
+			f.style.height = this.height  + "px";
+			w.style.top = this.top_ + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		onResizeTop: function(object, deltaX, deltaY) {
+			var f = this.content;
+			var w = this.window;
+
+			this.height = parseInt(f.style.height, 10) - deltaY;
+			this.top_ = parseInt(w.style.top, 10) + deltaY;
+
+			this.clipSize(false, true);
+
+			f.style.height = this.height  + "px";
+			w.style.top = this.top_ + "px";
+
+			this.moving();
+			this.resizing();
+
+			return this.res;
+		},
+
+		/**
+	    * Resize windows in order to fit content's width and heigth
+	    */
+		autoSizeWindow: function(){
+			var targetWindow = this.window;
+			var targetContent = this.content;
+
+			targetContent.style.height = this.settings.minHeight +'px';
+			targetWindow.style.width = this.settings.minWidth +'px';
+
+			targetContent.style.overflow = 'hidden';
+
+			var newHeight = targetContent.scrollHeight +'px';
+			var newWidth = (targetContent.scrollWidth + targetWindow.clientWidth - targetContent.clientWidth) + 'px';
+
+			targetContent.style.height = newHeight;
+
+			targetWindow.style.width = newWidth;
+
+			targetContent.style.overflow = 'auto';
 		}
-			
-		if (this.top_ < 0) {
-			this.top_ = 0;	
-		}							
-			
-		w.style.left = this.left_ + "px";
-		w.style.top = this.top_ + "px";
-		
-		this.moving();
-	},
-	
-	/**
-	 * Called when window is being moved
-	 */
-	moving: function() {
-	},
+	};
 
 	/**
-	 * Called when window is resizing.
+	 * Counter for generating unique component ids.
 	 */
-	resizing: function() {	
-	},	
-	
+	Wicket.Window.idCounter = 0;
+
 	/**
-	 * Ensures that the size of window is not smaller than minimal size.
+	 * Returns the modal window markup with specified element identifiers.
 	 */
-	clipSize : function(swapX, swapY) {
-		this.res = [0, 0];
+	Wicket.Window.getMarkup = function(idWindow, idClassElement, idCaption, idContent, idTop, idTopLeft, idTopRight, idLeft, idRight, idBottomLeft, idBottomRight, idBottom, idCaptionText, isFrame) {
+		var s =
+				"<div class=\"wicket-modal\" id=\""+idWindow+"\" role=\"dialog\" style=\"top: 10px; left: 10px; width: 100px;\"><form style='background-color:transparent;padding:0px;margin:0px;border-width:0px;position:static'>"+
+				"<div id=\""+idClassElement+"\">"+
 
-		if (this.width < this.settings.minWidth) {
-			this.left_ -= this.settings.minWidth - this.width;
-			this.res[0] = this.settings.minWidth - this.width;
-			this.width = this.settings.minWidth;
-		}
-		
-		if (this.height < this.settings.minHeight) {
-			this.top_ -= this.settings.minHeight - this.height;
-			this.res[1] = this.settings.minHeight - this.height;
-			this.height = this.settings.minHeight;
-		}
-		
-		if (swapX == true)
-			this.res[0] = -this.res[0];
-		if (swapY == true)
-			this.res[1] = -this.res[1];
-	},
-	
-	//
-	// These methods are handlers for parts of window frame
-	//
-	
-	onResizeBottomRight: function(object, deltaX, deltaY) {
-		var w = this.window;
-		var f = this.content;
-		
-		this.width = parseInt(w.style.width, 10) + deltaX;
-		this.height = parseInt(f.style.height, 10) + deltaY;
-								
-		this.clipSize();											
-											
-		w.style.width = this.width + "px";
-		f.style.height = this.height + "px";
-		
-		this.moving();
-		this.resizing();
-		
-		return this.res;
-	},
-	
-	onResizeBottomLeft: function(object, deltaX, deltaY) {
-		var w = this.window;
-		var f = this.content;
-		
-		this.width = parseInt(w.style.width, 10) - deltaX;
-		this.height = parseInt(f.style.height, 10) + deltaY;
-		this.left_ = parseInt(w.style.left, 10) + deltaX;
-		
-		this.clipSize(true);
-		
-		w.style.width = this.width + "px";
-		w.style.left = this.left_ + "px";
-		f.style.height = this.height  + "px";
-		
-		this.moving();
-		this.resizing();
-		
-		return this.res;
-	},	
-	
-	onResizeBottom: function(object, deltaX, deltaY) {
-		var f = this.content;					
-		this.height = parseInt(f.style.height, 10) + deltaY;
-		
-		this.clipSize();
-					
-		f.style.height = this.height + "px";
-		
-		this.resizing();
-		
-		return this.res;			
-	},
-
-	onResizeLeft: function(object, deltaX, deltaY) {
-		var w = this.window;
-
-		this.width = parseInt(w.style.width, 10) - deltaX;
-		this.left_ = parseInt(w.style.left, 10) + deltaX;
-		
-		this.clipSize(true);
-		
-		w.style.width = this.width + "px";
-		w.style.left = this.left_ + "px";
-		
-		this.moving();
-		this.resizing();
-		
-		return this.res;
-	},
-
-	onResizeRight: function(object, deltaX, deltaY) {
-		var w = this.window;
-		
-		this.width = parseInt(w.style.width, 10) + deltaX;
-
-		this.clipSize();
-											
-		w.style.width = this.width + "px";
-
-		this.resizing();
-			
-		return this.res;
-	},
-
-	onResizeTopLeft: function(object, deltaX, deltaY) {
-		var w = this.window;
-		var f = this.content;
-		
-		this.width = parseInt(w.style.width, 10) - deltaX;
-		this.height = parseInt(f.style.height, 10) - deltaY;
-		this.left_ = parseInt(w.style.left, 10) + deltaX;
-		this.top_ =  parseInt(w.style.top, 10) + deltaY;
-		
-		this.clipSize(true, true);
-		
-		w.style.width = this.width + "px";
-		w.style.left = this.left_ + "px";
-		f.style.height = this.height  + "px";
-		w.style.top = this.top_ + "px";
-		
-		this.moving();
-		this.resizing();
-									
-		return this.res;
-	},	
-
-	onResizeTopRight: function(object, deltaX, deltaY) {
-		var w = this.window;
-		var f = this.content;
-		
-		this.width = parseInt(w.style.width, 10) + deltaX;
-		this.height = parseInt(f.style.height, 10) - deltaY;
-		this.top_ = parseInt(w.style.top, 10) + deltaY;
-		
-		this.clipSize(false, true);
-		
-		w.style.width = this.width + "px";
-		f.style.height = this.height  + "px";
-		w.style.top = this.top_ + "px";
-		
-		this.moving();
-		this.resizing();
-						
-		return this.res;
-	},	
-	
-	onResizeTop: function(object, deltaX, deltaY) {
-		var f = this.content;
-		var w = this.window;
-		
-		this.height = parseInt(f.style.height, 10) - deltaY;
-		this.top_ = parseInt(w.style.top, 10) + deltaY;
-		
-		this.clipSize(false, true);
-		
-		f.style.height = this.height  + "px";
-		w.style.top = this.top_ + "px";
-		
-		this.moving();
-		this.resizing();
-						
-		return this.res;
-	},
+					"<div class=\"w_top_1\">"+
 
-	/**
- 	* Resize windows in order to fit content's width and heigth
- 	*/
-	autoSizeWindow: function(){
-		var targetWindow = this.window; 
-		var targetContent = this.content;
-
-		targetContent.style.height = this.settings.minHeight +'px';
-		targetWindow.style.width = this.settings.minWidth +'px';	
-
-		targetContent.style.overflow = 'hidden'; 
-	
-		var newHeight = targetContent.scrollHeight +'px';
-		var newWidth = (targetContent.scrollWidth + targetWindow.clientWidth - targetContent.clientWidth) + 'px';
-	
-		targetContent.style.height = newHeight;
-		
-		targetWindow.style.width = newWidth;	
-
-		targetContent.style.overflow = 'auto';
-	}
-}
-
-/**
- * Counter for generating unique component ids.
- */
-Wicket.Window.idCounter = 0;
+					"<div class=\"w_topLeft\" id=\""+idTopLeft+"\">"+
+					"</div>"+
 
-/**
- * Returns the modal window markup with specified element identifiers.
- */
-Wicket.Window.getMarkup = function(idWindow, idClassElement, idCaption, idContent, idTop, idTopLeft, idTopRight, idLeft, idRight, idBottomLeft, idBottomRight, idBottom, idCaptionText, isFrame) {
-	var s =
-			"<div class=\"wicket-modal\" id=\""+idWindow+"\" role=\"dialog\" style=\"top: 10px; left: 10px; width: 100px;\"><form style='background-color:transparent;padding:0px;margin:0px;border-width:0px;position:static'>"+
-			"<div id=\""+idClassElement+"\">"+
-				
-				"<div class=\"w_top_1\">"+
+					"<div class=\"w_topRight\" id=\""+idTopRight+"\">"+
+					"</div>"+
 
-				"<div class=\"w_topLeft\" id=\""+idTopLeft+"\">"+
-				"</div>"+				
+					"<div class=\"w_top\" id='"+idTop+"'>"+
+					"</div>"+
 
-				"<div class=\"w_topRight\" id=\""+idTopRight+"\">"+
-				"</div>"+
+					"</div>"+
 
-				"<div class=\"w_top\" id='"+idTop+"'>"+									
-				"</div>"+
+					"<div class=\"w_left\" id='"+idLeft+"'>"+
+						"<div class=\"w_right_1\">"+
+							"<div class=\"w_right\" id='"+idRight+"'>"+
+								"<div class=\"w_content_1\" onmousedown=\"if (Wicket.Browser.isSafari()) { event.ignore = true; }  else { Wicket.Event.stop(event); } \">"+
+									"<div class=\"w_caption\"  id=\""+idCaption+"\">"+
+										"<a class=\"w_close\" style=\"z-index:1\" href=\"#\"></a>"+
+										"<h3 id=\""+idCaptionText+"\" class=\"w_captionText\"></h3>"+
+									"</div>"+
 
-				"</div>"+
-								
-				"<div class=\"w_left\" id='"+idLeft+"'>"+
-					"<div class=\"w_right_1\">"+
-						"<div class=\"w_right\" id='"+idRight+"'>"+
-							"<div class=\"w_content_1\" onmousedown=\"if (Wicket.Browser.isSafari()) { event.ignore = true; }  else { Wicket.Event.stop(event); } \">"+																			
-								"<div class=\"w_caption\"  id=\""+idCaption+"\">"+
-									"<a class=\"w_close\" style=\"z-index:1\" href=\"#\"></a>"+									
-									"<h3 id=\""+idCaptionText+"\" class=\"w_captionText\"></h3>"+
-								"</div>"+
-							
-								"<div class=\"w_content_2\">"+
-								"<div class=\"w_content_3\">"+
-		 							"<div class=\"w_content\">";
-				if (isFrame) {
-					s+= "<iframe";
-					if (Wicket.Browser.isIELessThan7()) {
-						s+= " src=\"about:blank\""
+									"<div class=\"w_content_2\">"+
+									"<div class=\"w_content_3\">"+
+			                            "<div class=\"w_content\">";
+					if (isFrame) {
+						s+= "<iframe";
+						if (Wicket.Browser.isIELessThan7()) {
+							s+= " src=\"about:blank\"";
+						}
+						s+= " frameborder=\"0\" id=\""+idContent+"\" allowtransparency=\"false\" style=\"height: 200px\" class=\"wicket_modal\"></iframe>";
+					} else {
+						s+= "<div id='"+idContent+"' class='w_content_container'></div>";
 					}
-					s+= " frameborder=\"0\" id=\""+idContent+"\" allowtransparency=\"false\" style=\"height: 200px\" class=\"wicket_modal\"></iframe>";
-				} else {
-					s+=
-										"<div id='"+idContent+"' class='w_content_container'></div>";
-				}
-					s+= 						
+						s+=
+										"</div>"+
+									"</div>"+
 									"</div>"+
-								"</div>"+
 								"</div>"+
 							"</div>"+
 						"</div>"+
 					"</div>"+
-				"</div>"+
 
 
-				"<div class=\"w_bottom_1\" id=\""+idBottom+"_1\">"+					
-					
-					"<div class=\"w_bottomRight\"  id=\""+idBottomRight+"\">"+
-					"</div>"+
-					
-					"<div class=\"w_bottomLeft\" id=\""+idBottomLeft+"\">"+
-					"</div>"+
+					"<div class=\"w_bottom_1\" id=\""+idBottom+"_1\">"+
 
-					"<div class=\"w_bottom\" id=\""+idBottom+"\">"+				
-					"</div>"+				
+						"<div class=\"w_bottomRight\"  id=\""+idBottomRight+"\">"+
+						"</div>"+
 
+						"<div class=\"w_bottomLeft\" id=\""+idBottomLeft+"\">"+
+						"</div>"+
 
-				"</div>"+				
+						"<div class=\"w_bottom\" id=\""+idBottom+"\">"+
+						"</div>"+
 
 
-			"</div>"+
-		"</form></div>";
-		
-		return s;
-}
-	
+					"</div>"+
 
-/**
- * Transparent or semi-transparent masks that prevents user from interacting
- * with the portion of page behind a window.  
- */
-Wicket.Window.Mask = Wicket.Class.create();
+				"</div>"+
+			"</form></div>";
 
-Wicket.Window.Mask.zIndex = 20000;
+			return s;
+	};
 
-Wicket.Window.Mask.prototype = {
-			
 	/**
-	 * Creates the mask.
-	 * Created mask is not visible immediately. You have to call <code>show()</code> to
-	 * make it visible.
-	 * @param {boolean} transparent - whether the mask should be transparent (true) or 
-	 *                                semi-transparent (false).
+	 * Transparent or semi-transparent masks that prevents user from interacting
+	 * with the portion of page behind a window.
 	 */
-	initialize: function(transparent) {
-		this.transparent = transparent;		
-	},
-	
-	/**
-	 * Shows the mask.
-	 */
-	show: function() {				
-		
-		// if the mask is not already shown...
-		if (typeof(Wicket.Window.Mask.element) == "undefined" ||
-			Wicket.Window.Mask.element == null) {		
-		
-			// create the mask element and add it to the document
-			var e = document.createElement("div");
-			document.body.appendChild(e);							
-			
-			// set the proper css class name 
-			if (this.transparent) {
-				e.className = "wicket-mask-transparent";
-			} else {
-				e.className = "wicket-mask-dark";
-			}					
-		
-			e.style.zIndex = Wicket.Window.Mask.zIndex;
-
-			// HACK - KHTML doesn't support colors with alpha transparency
-			// if the mask is not transparent we have to either
-			// make the background image visible (setting color to transparent) - for KHTML
-			// or make the background-image invisible (setting it to null) - for other browsers												
-			if (this.transparent == false) {
-				if (Wicket.Browser.isKHTML() == false) {			
-					e.style.backgroundImage = "none";
+	Wicket.Window.Mask = Wicket.Class.create();
+
+	Wicket.Window.Mask.zIndex = 20000;
+
+	Wicket.Window.Mask.prototype = {
+
+		/**
+		 * Creates the mask.
+		 * Created mask is not visible immediately. You have to call <code>show()</code> to
+		 * make it visible.
+		 * @param {boolean} transparent - whether the mask should be transparent (true) or
+		 *                                semi-transparent (false).
+		 */
+		initialize: function(transparent) {
+			this.transparent = transparent;
+		},
+
+		/**
+		 * Shows the mask.
+		 */
+		show: function() {
+
+			// if the mask is not already shown...
+			if (!Wicket.Window.Mask.element) {
+
+				// create the mask element and add it to the document
+				var e = document.createElement("div");
+				document.body.appendChild(e);
+
+				// set the proper css class name
+				if (this.transparent) {
+					e.className = "wicket-mask-transparent";
 				} else {
-					e.style.backgroundColor = "transparent";
+					e.className = "wicket-mask-dark";
+				}
+
+				e.style.zIndex = Wicket.Window.Mask.zIndex;
+
+				// HACK - KHTML doesn't support colors with alpha transparency
+				// if the mask is not transparent we have to either
+				// make the background image visible (setting color to transparent) - for KHTML
+				// or make the background-image invisible (setting it to null) - for other browsers
+				if (this.transparent === false) {
+					if (Wicket.Browser.isKHTML() === false) {
+						e.style.backgroundImage = "none";
+					} else {
+						e.style.backgroundColor = "transparent";
+					}
+				}
+
+				// HACK - it really sucks that we have to set this to absolute even for gecko.
+				// however background with position:fixed makes the text cursor in textfieds
+				// in modal window disappear
+				if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
+					e.style.position = "absolute";
 				}
+
+				// set the element
+				this.element = e;
+
+				// preserver old handlers
+				this.old_onscroll = window.onscroll;
+				this.old_onresize = window.onresize;
+
+				// set new handlers
+				window.onscroll = Wicket.bind(this.onScrollResize, this);
+				window.onresize = Wicket.bind(this.onScrollResize, this);
+
+				// fix the mask position
+				this.onScrollResize(true);
+
+				// set a static reference to mask
+				Wicket.Window.Mask.element = e;
+			} else {
+				// mask is already shown - don't hide it
+				this.dontHide = true;
 			}
 
-			// HACK - it really sucks that we have to set this to absolute even for gecko.
-			// however background with position:fixed makes the text cursor in textfieds
-			// in modal window disappear
-			if (Wicket.Browser.isIE() || Wicket.Browser.isGecko()) {
-				e.style.position = "absolute";
+			this.shown=true;
+			this.focusDisabled=false;
+
+			this.disableCoveredContent();
+		},
+
+		/**
+		 * Hides the mask.
+		 */
+		hide: function() {
+
+			// cancel any pending tasks
+			this.cancelPendingTasks();
+
+			// if the mask is visible and we can hide it
+			if (typeof(Wicket.Window.Mask.element) !== "undefined" && typeof(this.dontHide) === "undefined") {
+
+				// remove element from document
+				document.body.removeChild(this.element);
+				this.element = null;
+
+				// restore old handlers
+				window.onscroll = this.old_onscroll;
+				window.onresize = this.old_onresize;
+
+				Wicket.Window.Mask.element = null;
 			}
 
-			// set the element							 							
-			this.element = e;
-					
-			// preserver old handlers
-			this.old_onscroll = window.onscroll;
-			this.old_onresize = window.onresize;
-			
-			// set new handlers
-			window.onscroll = Wicket.bind(this.onScrollResize, this);
-			window.onresize = Wicket.bind(this.onScrollResize, this);
-			
-			// fix the mask position
-			this.onScrollResize(true);
-						
-			// set a static reference to mask
-			Wicket.Window.Mask.element = e;			
-		} else {
-			// mask is already shown - don't hide it
-			this.dontHide = true; 			
-		}
-		
-		this.shown=true;
-		this.focusDisabled=false;
-				
-		this.disableCoveredContent();
-	},
-	
-	/**
-	 * Hides the mask.
-	 */
-	hide: function() {			
-
-		// cancel any pending tasks
-		this.cancelPendingTasks();
-		
-		// if the mask is visible and we can hide it
-		if (typeof(Wicket.Window.Mask.element) != "undefined" && typeof(this.dontHide) == "undefined") {
-	
-			// remove element from document	
-			document.body.removeChild(this.element);
-			this.element = null;
-			
-			// restore old handlers
-			window.onscroll = this.old_onscroll;
-			window.onresize = this.old_onresize;
-						
-			Wicket.Window.Mask.element = null;
-		}
-		
-		this.shown=false;
-		
-		this.reenableCoveredContent();
-		
-	},
-	
-	// disable user interaction for content that is covered by the mask
-	disableCoveredContent: function() {
-		var doc = document;
-		var old = Wicket.Window.current.oldWindow;
-		if (typeof(old) != "undefined" && old != null) {
-			doc = old.getContentDocument();
-		}
+			this.shown=false;
 
-		this.doDisable(doc, Wicket.Window.current);
-	},
-	
-	tasks: [],
-	startTask: function (fn, delay) {
-		var taskId=setTimeout(Wicket.bind(function() { fn(); this.clearTask(taskId); }, this), delay);
-		this.tasks.push(taskId);
-	},
-	clearTask: function (taskId) {
-		var index=-1;
-		for (var i=0;i<this.tasks.length;i++) {
-			if (this.tasks[i]==taskId) {
-				index=i;break;
+			this.reenableCoveredContent();
+		},
+
+		// disable user interaction for content that is covered by the mask
+		disableCoveredContent: function() {
+			var doc = document;
+			var old = Wicket.Window.current.oldWindow;
+			if (old) {
+				doc = old.getContentDocument();
 			}
-		}
-		if (index>=0) {
-			this.tasks.splice(index,1);
-		}
-	},
-	cancelPendingTasks: function() {
-		while (this.tasks.length>0) {
-			var taskId=this.tasks.shift();
-			clearTimeout(taskId);
-		}
-	},
-	
-	// disable user interaction for content that is covered by the mask inside the given document, taking into consideration that this modal window is or not in an iframe
-	// and has the given content
-	doDisable: function(doc, win) {
-		this.startTask(Wicket.bind(function() {this.hideSelectBoxes(doc, win)}, this), 300);
-		this.startTask(Wicket.bind(function() {this.disableTabs(doc, win)}, this), 400);
-		this.startTask(Wicket.bind(function() {this.disableFocus(doc, win)}, this), 1000);
-	},
-	
-	// reenable user interaction for content that was covered by the mask
-	reenableCoveredContent: function() {
-		// show old select boxes (ie only)
-		this.showSelectBoxes();
-
-		// restore tab order
-		this.restoreTabs();
-
-		// revert onfocus handlers
-		this.enableFocus();
-	},
-	
-	/**
-	 * Used to update the position (ie) and size (ie, opera) of the mask.
-	 */
-	onScrollResize: function(dontChangePosition) {							
-		// if the iframe is not position:fixed fix it's position
-		if (this.element.style.position == "absolute") {
-		
-			var w = Wicket.Window.getViewportWidth();
-			var h = Wicket.Window.getViewportHeight();
-	
-			var scTop = 0;
-			var scLeft = 0;	 	
-	 
- 			scLeft = Wicket.Window.getScrollX();
-			scTop = Wicket.Window.getScrollY();
-	 		
-			this.element.style.top = scTop + "px";
-			this.element.style.left = scLeft + "px";
-	
-			if (document.all) { // opera or explorer
-				this.element.style.width = w;
-			}	
-			this.element.style.height = h;		
-		} 		
-	},
 
-	/**
-	 * Returns true if 'element' is a child (anywhere in hierarchy) of 'parent'
-	 */ 
-	isParent: function(element, parent) {		
-		if (element.parentNode == parent)
-			return true;
-		if (typeof(element.parentNode) == "undefined" ||
-			element.parentNode == document.body)
-			return false;
-		return this.isParent(element.parentNode, parent);			
-	},
+			this.doDisable(doc, Wicket.Window.current);
+		},
+
+		tasks: [],
+		startTask: function (fn, delay) {
+			var taskId=setTimeout(Wicket.bind(function() { fn(); this.clearTask(taskId); }, this), delay);
+			this.tasks.push(taskId);
+		},
+		clearTask: function (taskId) {
+			var index=-1;
+			for (var i=0;i<this.tasks.length;i++) {
+				if (this.tasks[i] === taskId) {
+					index=i;break;
+				}
+			}
+			if (index>=0) {
+				this.tasks.splice(index,1);
+			}
+		},
+		cancelPendingTasks: function() {
+			while (this.tasks.length>0) {
+				var taskId=this.tasks.shift();
+				clearTimeout(taskId);
+			}
+		},
 
+		// disable user interaction for content that is covered by the mask inside the given document, taking into consideration that this modal window is or not in an iframe
+		// and has the given content
+		doDisable: function(doc, win) {
+			this.startTask(Wicket.bind(function() {this.hideSelectBoxes(doc, win);}, this), 300);
+			this.startTask(Wicket.bind(function() {this.disableTabs(doc, win);}, this), 400);
+			this.startTask(Wicket.bind(function() {this.disableFocus(doc, win);}, this), 1000);
+		},
 
-	/**
-	 * For internet explorer hides the select boxes (because they
-	 * have always bigger z-order than any other elements).
-	 */
-	hideSelectBoxes : function(doc, win) {				
-		if (!this.shown) {
-			return;
-		}
-		
-		if (Wicket.Browser.isIE() && Wicket.Browser.isIE7() == false) {
-			this.boxes = new Array();
-			var selects = doc.getElementsByTagName("select");
-			for (var i = 0; i < selects.length; i++) {				
-				var element = selects[i];
-				
-				// if this is not an iframe window and the select is child of window content,
-				// don't hide it					
-				if (win.isIframe() == false && this.isParent(element, win.content)) {
-					continue;
-				}				
-				
-				if (element.style.visibility != "hidden") {
-					element.style.visibility = "hidden";
-					this.boxes.push(element);
-				}				
+		// reenable user interaction for content that was covered by the mask
+		reenableCoveredContent: function() {
+			// show old select boxes (ie only)
+			this.showSelectBoxes();
+
+			// restore tab order
+			this.restoreTabs();
+
+			// revert onfocus handlers
+			this.enableFocus();
+		},
+
+		/**
+		 * Used to update the position (ie) and size (ie, opera) of the mask.
+		 */
+		onScrollResize: function(dontChangePosition) {
+			// if the iframe is not position:fixed fix it's position
+			if (this.element.style.position === "absolute") {
+
+				var w = Wicket.Window.getViewportWidth();
+				var h = Wicket.Window.getViewportHeight();
+
+				var scTop = 0;
+				var scLeft = 0;
+
+	            scLeft = Wicket.Window.getScrollX();
+				scTop = Wicket.Window.getScrollY();
+
+				this.element.style.top = scTop + "px";
+				this.element.style.left = scLeft + "px";
+
+				if (document.all) { // opera or explorer
+					this.element.style.width = w;
+				}
+				this.element.style.height = h;
 			}
-		}
-	},
-	
-	/**
-	 * Shows the select boxes if they were hidden. 
-	 */
-	showSelectBoxes: function() {
-		if (typeof (this.boxes) != "undefined") {
-			for (var i = 0; i < this.boxes.length; ++i) {
-				var element = this.boxes[i];
-				element.style.visibility="visible";
-			}
-			this.boxes = null;
-		}		
-	},
-	
-	/**
-	 * Disable focus on element and all it's children.	 
-	 */
-	disableFocusElement: function(element, revertList, win) {
-				
-		if (typeof(win) != "undefined" &&
-			win != null &&
-			win.window != element) {								
-				
-			revertList.push([element, element.onfocus]);
-			element.onfocus = function() { element.blur(); }			
-			
-			for (var i = 0; i < element.childNodes.length; ++i) {
-				this.disableFocusElement(element.childNodes[i], revertList, win);
+		},
+
+		/**
+		 * Returns true if 'element' is a child (anywhere in hierarchy) of 'parent'
+		 */
+		isParent: function(element, parent) {
+			if (element.parentNode === parent) {
+				return true;
 			}
-		}
-	},
-	
-	/**
-	 * Disable focus on all elements in document
-	 */
-	disableFocus: function(doc, win) {
-		if (!this.shown) {
-			return;
-		}
-		// explorer doesn't need this, because for IE disableTabs() is called.
-		// plus in IE this causes problems because it scrolls document		);
-		if (Wicket.Browser.isIE() == false) {			
-			this.focusRevertList = new Array();			
-			var body = doc.getElementsByTagName("body")[0];			
-			for (var i = 0; i < body.childNodes.length; ++i) {		
-				this.disableFocusElement(body.childNodes[i], this.focusRevertList, win);
+			if (typeof(element.parentNode) === "undefined" || element.parentNode === document.body) {
+				return false;
 			}
-		}
-		this.focusDisabled=true;
-	},
-	
-	/**
-	 * Enables focus on all elements where the focus has been disabled.
-	 */
-	enableFocus: function() {
-		if (this.focusDisabled==false) {
-			return;
-		}
-		
-		if (typeof(this.focusRevertList) != "undefined") {						
-			for (var i = 0; i < this.focusRevertList.length; ++i) {
-				var item = this.focusRevertList[i];
-				item[0].onfocus = item[1];
+			return this.isParent(element.parentNode, parent);
+		},
+
+		/**
+		 * For internet explorer hides the select boxes (because they
+		 * have always bigger z-order than any other elements).
+		 */
+		hideSelectBoxes : function(doc, win) {
+			if (!this.shown) {
+				return;
 			}
-		}
-		this.focusRevertList = null;
-	},	
-	
-	
-	/**
-	 * Disable tab indexes (ie).
-	 */
-	disableTabs: function (doc, win) {
-		if (!this.shown) {
-			return;
-		}
-		
-		if (typeof (this.tabbableTags) == "undefined") this.tabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME", "SELECT");
-		if (Wicket.Browser.isIE()) {
-			this.disabledTabsRevertList = new Array();
-			for (var j = 0; j < this.tabbableTags.length; j++) {
-				var tagElements = doc.getElementsByTagName(this.tabbableTags[j]);
-				for (var k = 0 ; k < tagElements.length; k++) {
-					// if this is not an iframe window and the element is child of window content,
-					// don't disable tab on it
-					if (win.isIframe() == true || this.isParent(tagElements[k], win.content) == false) {
-						var element = tagElements[k];
-						element.hiddenTabIndex = element.tabIndex;
-						element.tabIndex="-1";
-						this.disabledTabsRevertList.push(element);
+
+			if (Wicket.Browser.isIE() && Wicket.Browser.isIE7() === false) {
+				this.boxes = [];
+				var selects = doc.getElementsByTagName("select");
+				for (var i = 0; i < selects.length; i++) {
+					var element = selects[i];
+
+					// if this is not an iframe window and the select is child of window content,
+					// don't hide it
+					if (win.isIframe() === false && this.isParent(element, win.content)) {
+						continue;
+					}
+
+					if (element.style.visibility !== "hidden") {
+						element.style.visibility = "hidden";
+						this.boxes.push(element);
 					}
 				}
 			}
+		},
+
+		/**
+		 * Shows the select boxes if they were hidden.
+		 */
+		showSelectBoxes: function() {
+			if (typeof (this.boxes) !== "undefined") {
+				for (var i = 0; i < this.boxes.length; ++i) {
+					var element = this.boxes[i];
+					element.style.visibility="visible";
+				}
+				this.boxes = null;
+			}
+		},
+
+		/**
+		 * Disable focus on element and all it's children.
+		 */
+		disableFocusElement: function(element, revertList, win) {
+
+			if (win && win.window !== element) {
+
+				revertList.push([element, element.onfocus]);
+				element.onfocus = function() { element.blur(); };
+
+				for (var i = 0; i < element.childNodes.length; ++i) {
+					this.disableFocusElement(element.childNodes[i], revertList, win);
+				}
+			}
+		},
+
+		/**
+		 * Disable focus on all elements in document
+		 */
+		disableFocus: function(doc, win) {
+			if (!this.shown) {
+				return;
+			}
+			// explorer doesn't need this, because for IE disableTabs() is called.
+			// plus in IE this causes problems because it scrolls document		);
+			if (Wicket.Browser.isIE() === false) {
+				this.focusRevertList = [];
+				var body = doc.getElementsByTagName("body")[0];
+				for (var i = 0; i < body.childNodes.length; ++i) {
+					this.disableFocusElement(body.childNodes[i], this.focusRevertList, win);
+				}
+			}
+			this.focusDisabled=true;
+		},
+
+		/**
+		 * Enables focus on all elements where the focus has been disabled.
+		 */
+		enableFocus: function() {
+			if (this.focusDisabled === false) {
+				return;
+			}
+
+			if (typeof(this.focusRevertList) !== "undefined") {
+				for (var i = 0; i < this.focusRevertList.length; ++i) {
+					var item = this.focusRevertList[i];
+					item[0].onfocus = item[1];
+				}
+			}
+			this.focusRevertList = null;
+		},
+
+		/**
+		 * Disable tab indexes (ie).
+		 */
+		disableTabs: function (doc, win) {
+			if (!this.shown) {
+				return;
+			}
+
+			if (typeof (this.tabbableTags) === "undefined") {
+				this.tabbableTags = ["A", "BUTTON", "TEXTAREA", "INPUT", "IFRAME", "SELECT"];
+			}
+			if (Wicket.Browser.isIE()) {
+				this.disabledTabsRevertList = [];
+				for (var j = 0; j < this.tabbableTags.length; j++) {
+					var tagElements = doc.getElementsByTagName(this.tabbableTags[j]);
+					for (var k = 0 ; k < tagElements.length; k++) {
+						// if this is not an iframe window and the element is child of window content,
+						// don't disable tab on it
+						if (win.isIframe() === true || this.isParent(tagElements[k], win.content) === false) {
+							var element = tagElements[k];
+							element.hiddenTabIndex = element.tabIndex;
+							element.tabIndex="-1";
+							this.disabledTabsRevertList.push(element);
+						}
+					}
+				}
+			}
+		},
+
+		/**
+		 * Restore tab indexes if they were disabled.
+		 */
+		restoreTabs: function() {
+			if (typeof (this.disabledTabsRevertList) !== "undefined" && this.disabledTabsRevertList !== null) {
+				for (var i = 0; i < this.disabledTabsRevertList.length; ++i) {
+					var element = this.disabledTabsRevertList[i];
+					if (typeof(element.hiddenTabIndex) !== 'undefined') {
+						element.tabIndex = element.hiddenTabIndex;
+						try {
+							delete element.hiddenTabIndex;
+						} catch (e) {
+							element.hiddenTabIndex = undefined;
+						}
+					}
+				}
+				this.disabledTabsRevertList = null;
+			}
 		}
-	},
+	};
 
 	/**
-	 * Restore tab indexes if they were disabled.
+	 * Returns the height of visible area.
 	 */
-	restoreTabs: function() {
-		if (typeof (this.disabledTabsRevertList) != "undefined" && this.disabledTabsRevertList != null) {
-			for (var i = 0; i < this.disabledTabsRevertList.length; ++i) {
-				var element = this.disabledTabsRevertList[i];
-				if (typeof(element.hiddenTabIndex) != 'undefined') {
-					element.tabIndex = element.hiddenTabIndex;
-					try { delete element.hiddenTabIndex; } catch (e) { element.hiddenTabIndex = undefined; }
-				}
-			}
-			this.disabledTabsRevertList = null;
+	Wicket.Window.getViewportHeight = function() {
+		if (typeof(window.innerHeight) !== "undefined") {
+			return window.innerHeight;
 		}
-	}
 
-}
+		if (document.compatMode === 'CSS1Compat') {
+			return document.documentElement.clientHeight;
+		}
 
-/**
- * Returns the height of visible area.
- */
-Wicket.Window.getViewportHeight = function() {
-	if (typeof(window.innerHeight) != "undefined") 
-		return window.innerHeight;
-	
-	if (document.compatMode == 'CSS1Compat') 
-		return docu

<TRUNCATED>