function Window(winID, options, contentData, callbacks) {
	if(winID != null && $("#Body").find("#Window_"+winID).length < 1) {
		var options = $.extend({
			title: 'Unknow Title',
			data: false,
			canMin: true,
			canMax: true,
			canClose: true,
			isMin: false,
			isMax: false,
			showInTask: 'button',
			icon: false,
			scrollAble: true,
			closeDesc: false,
			size: { width: 600, height: 500 },
			minSize: { width: 100, height: 100 }
		}, options);
		
		// ADD TO DESKTOP
		if(options.dontOpen != true) {
			var buttons =
			((options.canClose == true) ? '<div id="Close" class="wButton"></div>' : '')+
			((options.canMax == true) ? '<div id="Max" class="wButton"></div>' : '')+
			((options.canMin == true) ? '<div id="Min" class="wButton"></div>' : '');
			$("#Body").append(
				'<div id="Window_'+winID+'" class="window">'+
					'<div class="wTitle">'+
						'<div class="inner">'+options.title+'</div><div class="innerButtons">'+buttons+'</div>'+
					'</div>'+
					'<div class="content">'+((contentData != undefined) ? ((options.data == true) ? getData(contentData) : contentData) : '')+'</div>'+
				'</div>'
			);
		}
		
		var task = $("#Body").find("#TaskBar");
		var win = $("#Body").find("#Window_"+winID); win.data("winID", winID);
		var title = win.find(".wTitle");
		var content = win.find(".content");
		var isMin = false, oldTop, oldPos, oldSize; win.css("z-index", ++zIndex);
		if(options.scrollAble == false) content.css("overflow", "hidden");
		
		// EVENTS
		function closeWindow() {
			if(options.canClose == true) {
				win.remove();
				if(options.showInTask != 'icon') $("#Body").find("#Button_"+winID).remove();
				if(options.showInTask == 'icon') {
					var button = $("#Body").find("#Button_"+winID);
					button.XEvent({ mouseclick: function() { new Window(winID, options, contentData, callbacks); } });
					if(activeWindow == win) $("#Body").find("#Button_"+winID).removeClass("active");
				}
			} else { alert("Konnte Fenster nicht Schließen, Grund dafür ist:\n"+(options.closeDesc == false) ? 'Unbekannt' : options.closeDesc); }
		}
		
		function updateWindowState(state) {
			switch(state) {
				case 'max':
					if(options.isMax == true) {
						$(window).unbind("resize.window");
						win.offset({ left: oldPos.x, top: oldPos.y });
						win.width(oldSize.width);
						win.height(oldSize.height);
						updateContent();
						options.isMax = false;
						win.XWindowManager('update', { isMax: options.isMax });
					} else {
						oldPos = {
							x: win.offset().left,
							y: win.offset().top
						};
						
						oldSize = {
							width: win.width(),
							height: win.height()
						};
						
						updateMax();
						$(window).bind('resize.window', function() {
							updateMax();
						});
						options.isMax = true;
						win.XWindowManager('update', { isMax: options.isMax });
					}
					break;
					
				case 'min':
					if(isMin == true) {
						if(activeWindow == win) $("#Body").find("#Button_"+winID).addClass("active");
						win.animate({ top: "-="+50+"px" }, {queue: false, duration: 200});
						win.fadeIn(200, function() { isMin = false; });
					} else {
						if(activeWindow == win) $("#Body").find("#Button_"+winID).removeClass("active");
						//oldPos = win.offset().top;
						win.animate({ top: "+="+50+"px" }, {queue: false, duration: 200});
						win.fadeOut(200, function() { isMin = true; });
					}
					break;
			}
		}
		
		function updateMax() {
			var width = $("#Body").width()-6;
			var height = $("#Body").height()-$("#Body").find("#Bottom").height()-11;
			win.offset({ left: 0, top: 0 });
			win.width(width);
			win.height(height);
			updateContent();
		}
		
		function updateContent() {
			content.height(win.height()-title.height());
			if(callbacks != undefined && callbacks.resize != undefined) callbacks.resize();
		} function updateTitle() { title.find(".inner").html(options.title); }
		
		//
		this.getOption = function(o) { if(options[o]) return options[o]; return false; };
		this.setOption = function(o, v) {
			if(options[o]) {
				options[o] = v;
				if(o == 'title') updateTitle();
				if(o == 'scrollAble') (options.scrollAble == false) ? content.css("overflow", "hidden") : content.css("overflow", "auto");
				return true;
			} else {
				return false;
			}
		}; this.getFunc = function() { if(callbacks != undefined && callbacks.Funcs != undefined) return callbacks.Funcs; };
		
		if(options.dontOpen != true) {
			// BUTTONS
			var buttonOptions = {
				duration: { init: 1000, on: 200, off: 300 },
				opacity: { on: 0.95, off: 0.5 }
			};
			if(options.canClose == true) {
				title.find("#Close").XEvent({
					init: function() { XEvent.Fade(title.find("#Close"), buttonOptions.duration.init, buttonOptions.opacity.off); },
					mouseenter: function() { win.XWindowManager('update', { isOverClose: true }); XEvent.Fade(title.find("#Close"), buttonOptions.duration.on, buttonOptions.opacity.on); },
					mouseleave: function() { win.XWindowManager('update', { isOverClose: false }); XEvent.Fade(title.find("#Close"), buttonOptions.duration.off, buttonOptions.opacity.off); },
					mouseclick: function() { closeWindow(); }
				});
			}
			
			if(options.canMax == true) {
				title.find("#Max").XEvent({
					init: function() { XEvent.Fade(title.find("#Max"), buttonOptions.duration.init, buttonOptions.opacity.off); },
					mouseenter: function() { win.XWindowManager('update', { isOverMax: true }); XEvent.Fade(title.find("#Max"), buttonOptions.duration.on, buttonOptions.opacity.on); },
					mouseleave: function() { win.XWindowManager('update', { isOverMax: false }); XEvent.Fade(title.find("#Max"), buttonOptions.duration.off, buttonOptions.opacity.off); },
					mouseclick: function() { updateWindowState('max'); }
				});
			}
			
			if(options.canMin == true) {
				title.find("#Min").XEvent({
					init: function() { XEvent.Fade(title.find("#Min"), buttonOptions.duration.init, buttonOptions.opacity.off); },
					mouseenter: function() { win.XWindowManager('update', { isOverMin: true }); XEvent.Fade(title.find("#Min"), buttonOptions.duration.on, buttonOptions.opacity.on); },
					mouseleave: function() { win.XWindowManager('update', { isOverMin: false }); XEvent.Fade(title.find("#Min"), buttonOptions.duration.off, buttonOptions.opacity.off); },
					mouseclick: function() { if(isMin == false) updateWindowState('min'); }
				});
			}
			
			// SIZE
			win.width(options.size.width);
			win.height(options.size.height);
			updateContent();
			
			// CLICK
			win.bind('mousedown.updatePos', function() {
				if(activeWindow != win) {
					if(activeWindow != null) $("#Body").find("#Button_"+activeWindow.data('winID')).removeClass("active");
					activeWindow = win;
					activeWindow.css("z-index", ++zIndex);
					$("#Body").find("#Button_"+activeWindow.data('winID')).addClass("active");
				}
			});
			
			win.XWindowManager(null, { minSize: options.minSize, isMax: options.isMax, callbacks: callbacks });
			
			// SHOW
			win.offset({
				top: XUtils.getCenter($("#Body").height()-$("#Bottom").height(), win.height()),
				left: XUtils.getCenter($("#Body").width(), win.width())
			}); if(options.isMin != true) win.fadeIn(300); if(callbacks != undefined && callbacks.init != undefined) callbacks.init({ options: options, content: content });
		}
		
		// TASK
		var buttonOptions2 = {
			duration: { init: 300, on: 100, off: 200 },
			opacity: { on: 1.0, off: 0.7 }
		};
		
		if(options.showInTask == 'button') {
			task.find(".tInner").append('<div id="Button_'+winID+'" class="tButton"><div class="inner">'+options.title+'</div></div>');
		} else if(options.showInTask == 'icon') {
			if($("#Body").find("#Button_"+winID).length < 1) task.find(".icons").append('<div id="Button_'+winID+'" class="tButton"><div class="inner">'+((options.icon != false) ? '<div class="icon '+options.icon+'"></div>' : "Icon")+'</div></div>');
		}
		
		var button = $("#Body").find("#Button_"+winID);
		if(options.dontOpen != true) {
			if(activeWindow != null) $("#Body").find("#Button_"+activeWindow.data('winID')).removeClass("active");
			if(options.isMin != true) { button.addClass("active"); activeWindow = win; }
		}
		button.XEvent({
			init: function() { XEvent.Fade(button, buttonOptions2.duration.init, buttonOptions2.opacity.on, function() {
				XEvent.Fade(button, buttonOptions2.duration.init, buttonOptions2.opacity.off);
			}); },
			mouseenter: function() { XEvent.Fade(button, buttonOptions2.duration.on, buttonOptions2.opacity.on); },
			mouseleave: function() { XEvent.Fade(button, buttonOptions2.duration.off, buttonOptions2.opacity.off); },
			mouseclick: function() { if(options.dontOpen != true) { if(isMin == true) updateWindowState('min'); win.trigger('mousedown.updatePos'); } else { options.dontOpen = false; new Window(winID, options, contentData, callbacks); } }
		}); XUtils.setTask(); if(options.dontOpen != true) if(options.isMin == true) updateWindowState('min');
	} else { if(winID != null) $("#Body").find("#Window_"+winID).trigger('mousedown.updatePos'); }
	
}

(function($) {
	
	var methods = {
		update: function(value) {
			if(value.isOverClose != undefined) this.data("isOverClose", value.isOverClose);
			if(value.isOverMax != undefined) this.data("isOverMax", value.isOverMax);
			if(value.isOverMin != undefined) this.data("isOverMin", value.isOverMin);
			if(value.isMax != undefined) this.data("isMax", value.isMax);
		}
	};
	
	$.fn.XWindowManager = function(method, value) {
		
		if(methods[method]) {
			methods[method].apply(this, [value]);
		} else {
			var obj = this;
			var title = obj.find(".wTitle");
			var content = obj.find(".content");
			
			obj.data("minSize", false);
			obj.data("dragCursor", "none");
			obj.data("isMove", false);
			obj.data("isDrag", false);
			obj.data("isOverClose", false);
			obj.data("isOverMax", false);
			obj.data("isOverMin", false);
			obj.data("isMax", false);
			
			if(value.minSize != undefined) obj.data("minSize", value.minSize);
			if(value.isMax != undefined) obj.data("isMax", value.isMax);
			
			// DRAG
			var windowDrag = {
				isTitle: false,
				maxHeightOffset: false
			};
			
			this.bind('mousemove.windowDrag', function(e) {
				if(obj.data("isMove") == false) {
					windowDrag.mouseOffset = {
						x: e.pageX - title.offset().left,
						y: e.pageY - title.offset().top
					};
					
					windowDrag.size = {
						width: title.width(),
						height: title.height()
					};
				}
			});
			 
			this.bind('mousedown.windowDrag', function(e) {
				if(windowDrag.mouseOffset != undefined && e.which == 1) {
					if(windowDrag.mouseOffset.x >= 0 && windowDrag.mouseOffset.x < windowDrag.size.width && windowDrag.mouseOffset.y >= 0 && windowDrag.mouseOffset.y < windowDrag.size.height) { windowDrag.isTitle = true; } else { windowDrag.isTitle = false; }
					if(windowDrag.maxHeightOffset == false) windowDrag.maxHeightOffset = $("#Body").height()-$("#Body").find("#Bottom").height()-windowDrag.size.height-6;
					
					if(windowDrag.isTitle == true && obj.data("dragCursor") == "none" && obj.data("isOverClose") == false && obj.data("isOverMax") == false && obj.data("isOverMin") == false && obj.data("isMax") == false) {
						obj.data("isMove", true);
						
						XEvent.Fade(obj, 100, 0.6);
						$("#Body").bind('mousemove.windowDrag', function(e) {
							XUtils.adjustOffset(obj, { x: e.pageX-windowDrag.mouseOffset.x-3, y: e.pageY-windowDrag.mouseOffset.y-3, maxHeightOffset: windowDrag.maxHeightOffset });
						});
					}
				}
			});
			
			$("#Body").bind('mouseup.windowDrag', function() {
				if(obj.data("isMove") == true) {
					XEvent.Fade(obj, 100, 1.0);
					$("#Body").unbind('mousemove.windowDrag');
					obj.data("isMove", false);
					windowDrag.isTitle = false;
					windowDrag.maxHeightOffset = false;
				}
			});
			
			// RESIZE	
			var windowResize = {
				thickness: { corner: 7, border: 3 },
				maxHeightOffset: false
			};
			
			function mousemove(e) {
				if(obj.data("isDrag") == false && obj.data("isMove") == false && obj.data("isMax") == false) {
					windowResize.mouseOffset = {
						x: e.pageX - obj.offset().left,
						y: e.pageY - obj.offset().top
					};
					
					windowResize.size = {
						width: obj.outerWidth(true),
						height: obj.outerHeight(true)
					};
					
					obj.data("dragCursor", XUtils.getCursorPos(windowResize.mouseOffset, windowResize.size, windowResize.thickness));
					setCursor(obj.data("dragCursor"));
				}
			}
			this.bind('mousemove.windowResize', mousemove);
			this.bind('mouseleave.windowResize', function() { if(obj.data("dragCursor") != "none" && obj.data("isDrag") == false) setCursor("default", true); });
			
			this.bind('mousedown.windowResize', function(e) {
				mousemove(e);
				if(obj.data("dragCursor") != "none" && e.which == 1) {
					setCursor(obj.data("dragCursor"), true);
					var minWidth = false;
					var minHeight = false;
					obj.data("isDrag", true);
					if(windowResize.maxHeightOffset == false) windowResize.maxHeightOffset = $("#Body").height()-$("#Body").find("#Bottom").height()-title.height()-6;
					
					var dragOffset = {
						x: $(this).offset().left,
						y: $(this).offset().top
					};
					var dragSize = {
						width: $(this).width(),
						height: $(this).height()
					};
					
					if(minWidth == false) minWidth = dragOffset.x+dragSize.width-obj.data("minSize").width;
					if(minHeight == false) minHeight = dragOffset.y+dragSize.height-obj.data("minSize").height;
					
					$("#Body").bind('mousemove.windowResize', function(e) {
						switch(obj.data("dragCursor")) {
							case "NW":
								XUtils.adjustOffset(obj, { x: e.pageX-windowResize.mouseOffset.x, y: e.pageY-windowResize.mouseOffset.y, minWidth: minWidth, minHeight: minHeight, maxHeightOffset: windowResize.maxHeightOffset });
								XUtils.adjustSize(obj, { width: dragSize.width+(dragOffset.x-obj.offset().left), height: dragSize.height+(dragOffset.y-obj.offset().top), minWidth: obj.data("minSize").width, minHeight: obj.data("minSize").height });
								break;
								
							case "N":
								XUtils.adjustOffset(obj, { y: e.pageY-windowResize.mouseOffset.y, minHeight: minHeight, maxHeightOffset: windowResize.maxHeightOffset });
								XUtils.adjustSize(obj, { height: dragSize.height+(dragOffset.y-obj.offset().top), minHeight: obj.data("minSize").height });
								break;
								
							case "NE":
								XUtils.adjustOffset(obj, { y: e.pageY-windowResize.mouseOffset.y, minHeight: minHeight, maxHeightOffset: windowResize.maxHeightOffset });
								XUtils.adjustSize(obj, { width: e.pageX+(dragSize.width-windowResize.mouseOffset.x)-obj.offset().left, height: dragSize.height+(dragOffset.y-obj.offset().top), minWidth: obj.data("minSize").width, minHeight: obj.data("minSize").height });
								break;
								
							case "W":
								XUtils.adjustOffset(obj, { x: e.pageX-windowResize.mouseOffset.x, minWidth: minWidth });
								XUtils.adjustSize(obj, { width: dragSize.width+(dragOffset.x-obj.offset().left), minWidth: obj.data("minSize").width });
								break;
								
							case "E":
								XUtils.adjustSize(obj, { width: e.pageX+(dragSize.width-windowResize.mouseOffset.x)-obj.offset().left, minWidth: obj.data("minSize").width });
								break;
								
							case "SW":
								XUtils.adjustOffset(obj, { x: e.pageX-windowResize.mouseOffset.x, minWidth: minWidth });
								XUtils.adjustSize(obj, { width: dragSize.width+(dragOffset.x-obj.offset().left), height: e.pageY+(dragSize.height-windowResize.mouseOffset.y)-obj.offset().top, minWidth: obj.data("minSize").width, minHeight: obj.data("minSize").height });
								break;
								
							case "S":
								XUtils.adjustSize(obj, { height: e.pageY+(dragSize.height-windowResize.mouseOffset.y)-obj.offset().top, minHeight: obj.data("minSize").height });
								break;
								
							case "SE":
								XUtils.adjustSize(obj, { width: e.pageX+(dragSize.width-windowResize.mouseOffset.x)-obj.offset().left, height: e.pageY+(dragSize.height-windowResize.mouseOffset.y)-obj.offset().top, minWidth: obj.data("minSize").width, minHeight: obj.data("minSize").height });
								break;
						} content.height(obj.height()-title.height()); if(value.callbacks != undefined && value.callbacks.resize != undefined) value.callbacks.resize();
					});
				}
			});
			
			$("#Body").bind('mouseup.windowResize', function() {			
				if(obj.data("isDrag") == true) {
					$("#Body").unbind('mousemove.windowResize');
					obj.data("isDrag", false);
					minWidth = false;
					minHeight = false;
					//content.height(obj.height()-title.height());
					setCursor(XUtils.getCursorPos(windowResize.mouseOffset, windowResize.size, windowResize.thickness), true);
					if(value.callbacks != undefined && value.callbacks.resizeFinish != undefined) value.callbacks.resizeFinish();
				}
			});
			
			function setCursor(c, b) {
				var rC = c.toLowerCase()+"-resize";
				if(c.length > 2) { rC = "default"; }
				if(b == false) { this.css({ cursor: rC }); } else { $("body").css({ cursor: rC }); }
			}			
		}
		
	};
	
})(jQuery);
