var global = {
	window:null,
	editablewindow:null,
	console:null,
	huds:[],
	logincookie:null,
	author:null,
	commentcolor:"yellow",
	basicadress:"http://www.rt85.de/scripts/dbflexx/",
	imageadress:"http://www.rt85.de/media/page/images/",
	dbimages:"http://www.rt85.de/media/dbflexx/images/",
	inputspace:"dbwindow",
	rights:1,
	time : {
	},
	check : function () {
		if (this.tagName.toLowerCase() == "input" && this.value != "")
			return true;
		if (this.tagName.toLowerCase() == "textarea" && this.value != "")
			return true;
		return false;
	},
	initTime : function () {
		var time = new Date();
		global.time.year = time.getFullYear(),
		global.time.month = time.getMonth() < 10 ? "0" + (parseInt(time.getMonth() + 1)) : parseInt(time.getMonth() + 1);
		global.time.day = time.getDate() < 10 ? "0" + time.getDate() : time.getDate();
		global.time.hour = time.getHours() < 10 ? "0" + time.getHours() : time.getHours();
		global.time.minutes = time.getMinutes() < 10 ? "0" + time.getMinutes() : time.getMinutes();
		global.time.seconds = time.getSeconds() < 10 ? "0" + time.getSeconds() : time.getSeconds();
		global.time.timezone = time.getTimezoneOffset();
		global.time.weekday = time.getDay();
	},
	initUser : function () {
		global.author = preloadedUserinfo.author;
		global.rights = preloadedUserinfo.rights;
		global.commentcolor = preloadedUserinfo.color;
	},
	addMediaiFrameLoaded : function (argument) {
		var iframe = document.getElementsByTagName("iframe")[0];
		if (typeof(iframe.context) != "undefined") {
			iframe.functionName.call(iframe.context,argument);
		} else
			iframe.functionName(argument);
	},
	usedObjects:[],
	functionStack:[],
	tempAsyncStack:[],
	tempAsyncLength:0,
	activeWindow:null,
	activeElement:null,
	tempActiveWindowLoaded:false,
	checkLoadingState : function () {
		var asyncLoading = 0;
		for (value in global.tempAsyncStack) {
			if (global.tempAsyncStack[value] == "init") asyncLoading++;
		}
		global.asyncLength = asyncLoading;
	},
	push : {
		stack : []
	}
};

global.__defineSetter__("activeElement",function (value) { 
						if (global.activeElement != value && global.onblurStack != null && (value.additionalType != "actionbar" && value.parentNode.additionalType != "actionbar" && value.parentNode.parentNode.additionalType != "actionbar")) {
							var onblurStack = global.onblurStack.onblur; 
							for (var i = 0; i < onblurStack.length; i++) {
								onblurStack[i](value); 
							}; 
						}
						global.tempActiveElement = value;
						}
						);
global.__defineGetter__("activeElement",function () { return global.tempActiveElement; });

global.__defineSetter__("activeWindowLoaded",function (value) {
						if (global.onActiveWindowLoad instanceof Function) global.onActiveWindowLoad();
						global.tempActiveWindowLoaded = value;
						});
global.__defineGetter__("activeWindowLoaded",function () { return global.tempActiveWindowLoaded; });

global.__defineSetter__("asyncStack",function (value) {
						if (typeof global.tempAsyncStack[value] == "undefined") global.tempAsyncStack[value] = "init";
						else global.tempAsyncStack[value] = "loaded";
						global.checkLoadingState();
						});
global.__defineGetter__("asyncStack",function () { return global.tempAsyncStack; });

global.__defineSetter__("asyncLength",function (value) {
						if (value == 0) global.activeWindowLoaded = true;
						global.tempAsyncLength = value;
						});
global.__defineGetter__("asyncLength",function () { return global.tempAsyncLength; });









function Window (id,tabSettings,autoCache) {
	this.id = id + "windowdiv";
	this.autoCache = autoCache;
	global.windowobject = this;
	
	this.window = new Element(id + "window","dbglobalwindow","div",dodb(global.inputspace));
	global.window = this.window;
	
	this.commandBar = new CommandBar(id);
	
	this.editablewindow = new Element(id + "editablewindow","dbglobaleditablewindow","div");
	global.editablewindow = this.editablewindow;
	
	this.console = new Console(id,true);
	global.console = this.console;
	
	this.commandBar.commandBarContainer.insert(this.window);
	this.editablewindow.insert(this.window);
	this.console.statusBar.insert(this.window);
	
	this.tabs = typeof(tabSettings) == "object" ? new Tabs(id,tabSettings[0],tabSettings[1],tabSettings[2],tabSettings[3],tabSettings[4],tabSettings[5],"normal",this.autoCache,this,this.window,this.commandBar.commandBarContainer) : false;
	if (global.checkLoadingState() == true && global.window.onload instanceof Function) global.window.onload();
}





function Tabs (id,amountOfTabs,label,internLabel,functionNames,commandBar,active,style,autoCache,window,insertPlace,insertBeforePlace) {
	var self = this;
	var objectForArray = [this,"tab",global.activeWindow];
	global.usedObjects.push(objectForArray);
	
	this.id = id + "tabsdiv";
	this.amountOfTabs = amountOfTabs;
	this.label = label;
	this.internLabel = internLabel;
	this.commandBar = commandBar;
	this.functionNames = functionNames;
	this.commandBar = commandBar;
	this.active = active;
	this.cache = autoCache;
	this.window = window;
	
	this.containerclass = (style == "hud") ? "dbtabcontainer hud" : "dbtabcontainer";
	this.tabclass = (style == "hud") ? "dbtab hud" : "dbtab";
	
	var executeTab = null;
	
	if (typeof insertPlace == "undefined")
		var newtabcontainer = new Element(id + "tabs",this.containerclass + " inactive","div",this.window.window);
	else
		var newtabcontainer = new Element(id + "tabs",this.containerclass + " inactive","div",insertPlace,insertBeforePlace);
	
	this.tabs = new Array();
	for (i = 0; i < this.amountOfTabs; i++) {
		this.tabs[i] = new Element(id + i,this.tabclass + " inactive","div");
		this.tabs[i].text(label[i]);
		this.tabs[i].addStyle("width",100 / this.amountOfTabs + "%");
		this.tabs[i].addEvent("click",function () { self.activateTab.call(self,this); });
		this.tabs[i].insert(newtabcontainer);
		if (i == (active - 1))
			executeTab = i;
	}
	
	if (Cache.get(global.activeWindow + ";tab;" + this.id))
		executeTab = parseInt(Cache.get(global.activeWindow + ";tab;" + this.id));
	
	this.activateTab.call(this,executeTab);
}

Tabs.prototype.activateTab = function activateTab (which) {
	if (typeof(which) == "object") {
		var parentNode = which.parentNode;
		var i = 0;
		while (parentNode.childNodes[i] != which)
			i++;
		this.active = i;
	}
	else {
		if (typeof(which) == "string") {
			for (var i = 0; i < this.tabs.length; i++) {
				if (which == this.tabs[i].text()) {
					which = i;
					break;
				} else
					continue;
			}
		}
		if (typeof(which) == "string") {
			for (var i = 0; i < this.tabs.length; i++) {
				if (which == this.internLabel[i]) {
					which = i;
					break;
				} else
					continue;
			}
		}
		if (typeof(which) == "number") {
			this.active = which;
			which = this.tabs[which].object;
		}
	}
	
	Cache.cacheAll();
			
	
	for (i = 0; i < which.parentNode.childNodes.length; i++)
		which.parentNode.childNodes[i].className = this.tabclass + " inactive";
	which.className = this.tabclass + " active";
	
	this.window.editablewindow.text("clear");
	
	if (which.nextSibling == null)
		which.parentNode.className = this.containerclass + " active";
	else
		which.parentNode.className = this.containerclass + " inactive";
	
	if (this.commandBar[which.id.match(/\d/)]) {
		this.window.commandBar.reset();
		this.window.commandBar.show();
	} else
		this.window.commandBar.hide();
	
	this.functionNames[which.id.match(/\d/)]();
}





function Console (id,autoClear) {
	var self = this;
	
	this.id = id + "console";
	this.autoClear = autoClear;	
	this.errorlength = 0;
	this.warninglength = 0;
	
	this.windowActive = false;
	
	this.statusBar = new Element("dbglobalstatusbar","","div");
	
	this.loader = new Element("dbglobalstatus","","img",this.statusBar);
	if (typeof this.loader.object.style.webkitAnimationName != "undefined") {
		this.loader.addAttribute("src","../../media/dbflexx/images/loader.png");
		this.loader.addAttribute("class","animation");
	} else {
		this.loader.addAttribute("src","../../media/dbflexx/images/loader.gif");
	}
	//this.loader.addStyle("visibility","hidden");
	
	var consolebar = new Element("dbglobalconsolebar","","div",this.statusBar);
	
	this.warning = new Element("dbglobalwarning","","div",consolebar);
	this.warning.text(0);
	
	this.error = new Element("dbglobalerror","","div",consolebar);
	this.error.text(0);
	
	this.status = new Element("dbglobalstatus","","div",this.statusBar);
	this.status.text("Fertig.");
	
	this.loader.addLabel(this.status);
	
	this.database = new Database("console","Error and Warning Console","1048576",function () {
		if (self.database.version !== "1.0") {
			self.database.changeVersion("1.0",function () {
				self.errorStore = self.database.createObjectStore("error","id",true,["code","text"]);
				self.warningStore = self.database.createObjectStore("warning","id",true,["code","text"],function () { self.init.call(self); });
			});
		} else {
			self.errorStore = self.database.stores.error;
			self.warningStore = self.database.stores.warning;
			self.init();
		}
	});
}

Console.prototype.init = function () {
	var self = this;
	
	this.popupWindow = new HUD("dbglobalconsolepopup","dbconsolepopup","Fehlerkonsole",[2,["Warnung","Fehler"],["warning","error"],[function () { self.showPopup.call(self,"warning"); },function () { self.showPopup.call(self,"error");}],[false,false],1],"all",true,false,true);
	this.warning.addEvent("click",function showwarning () { self.popupWindow.open.call(self.popupWindow,"warning"); });
	this.error.addEvent("click",function showerror () { self.popupWindow.open.call(self.popupWindow,"error"); });
	
	if (this.autoClear === true)
		this.clear();
}

Console.prototype.addLoader = function (text) {
	this.loader.addStyle("visibility","visible");
	this.loader.label.text(text,true);
}

Console.prototype.finishLoader = function () {
	this.loader.addStyle("visibility","hidden");
	this.loader.label.text("Fertig.",true);
}

Console.prototype.clear = function () {
	this.errorStore.clear();
	this.warningStore.clear();
}
Console.prototype.addError = function (errorcode,errordetails) {
	this.errorlength++;
	this.errorStore.add({ code : errorcode, text : errordetails });
	this.error.text("++");
}
Console.prototype.addWarning = function (warningcode,warningdetails) {
	this.warninglength++;
	this.warningStore.add({ code : warningcode, text : warningdetails });
	this.warning.text("++");
}

Console.prototype.showPopup = function showPopup (flag) {
	var self = this;
	var whichTab,
		store;
	
	this.windowActive = true;
	
	switch (flag) {
		case "error" : 
			whichTab = "Fehler"; 
			store = self.errorStore; 
			break;
		case "warning" : 
			whichTab = "Warnung"; 
			store = self.warningStore; 
			break;
	}
	
	
	store.get(["code","text"],{},function (result) {
		self.showContent.call(self,result,whichTab);
	});
}
Console.prototype.showContent = function (result,flag) {
	for (var i = 0; i < global.huds.length; i++) {
		if (global.huds[i].id == "dbglobalconsolepopuphuddiv") {
			var popupWindow = global.huds[i];
			break;
		} else {
			continue;
		}
	}
	
	for (i = 0; i < result.length; i++) {
		var thisRow = result.rows[i];
		
		var container = new Element("dbconsolehuditem" + i,"dbconsolehuditem","div",popupWindow.editablewindow);
		var title = new Element("dbconsolehuditem" + i + "title","dbconsolehuditemtite","h1",container);
		title.text(thisRow.code);
		var text = new Element("dbconsolehuditem" + i + "text","dbconsolehuditemtext","p",container);
		text.text(thisRow.text);
	}
	
	if (result.length == 0) {
		var container = new Element("dbconsolehuditem" + i,"dbconsolehuditem","div",popupWindow.editablewindow);
		var text = new Element("dbconsolehuditem" + i + "text","dbconsolehuditemtext","p",container);
		if (flag == "Warnung")
			flag = "Warnungen";
		text.text("Es wurden keine " + flag + " gefunden.");
	}
}
	

function HUD (id,className,title,tabSettings,resize,minimize,open,autoCache) {
	var self = this;
	var objectForArray = [this,"hud",global.activeWindow];
	global.usedObjects.push(objectForArray);
	
	className = className ? className + " " : "";
	
	this.id = id + "huddiv";
	this.autoCache = autoCache;
	
	this.window = new Element(id + "hud",className + "window hud","div");
	this.window.insert(global.window);
	this.opened = open;
	
	if (Cache.get(global.activeWindow + ";hud;" + this.id)) {
		var cache = Cache.get(global.activeWindow + ";hud;" + this.id);
		cache = cache.split(";");
		this.opened = cache[0] == "true" ? true : false;
		this.window.addStyle(["left","top","width","height"],[cache[3] + "px",cache[4] + "px",cache[1] + "px",cache[2] + "px"]);
	}
	
	if (!this.opened)
		this.window.addStyle("display","none");
	
	global.huds[global.huds.length] = this;
	
	this.title = new Element(id + "hudtitle",className + "title hud","div",this.window);
	
	if (minimize) {
		this.minimizer = new Element(id + "hudminimize",className + "minimize hud","img",this.title);
		this.minimizer.addAttribute("src","../../media/dbflexx/images/minimize_hud.png");
		this.minimizer.addEvent("click",function minimize () { self.minimize.call(self); });
	} else {
		this.minimizer = new Element(id + "hudclose",className + "close hud","img",this.title);
		this.minimizer.addAttribute("src","../../media/dbflexx/images/close_hud.png");
	}
	
	this.title.text(title);
	
	this.commandBar = new CommandBar(id);
	
	this.editablewindow = new Element(id + "hudeditable",className + "dbeditablewindow hud","div",this.window);
	
	this.tabs = typeof(tabSettings) == "object" ? new Tabs(id + "hudtabs",tabSettings[0],tabSettings[1],tabSettings[2],tabSettings[3],tabSettings[4],tabSettings[5],"hud",this.autoCache,this) : false;
	
	this.commandBar.commandBar.insert(this.window);
	this.editablewindow.insert(this.window);
	
	this.window.makeDragable(this.title);
	
	if (resize)
		this.window.makeResizable.call(this.window,new Resizer(id,"hud","bottom right"),false,[200,300],"all");
}

HUD.prototype.open = function (activeTab) {
	if (!this.opened)
		this.window.addStyle("display","block");
	this.tabs.activateTab(activeTab);
	this.opened = true;
}

HUD.prototype.minimize = function () {
	this.window.addStyle("display","none");
	this.opened = false;
}
	
HUD.prototype.activateTab = function HUDactivate (activeTab) {
	this.tabs.activateTab(activeTab);
}

function CommandBar (id,style) {
	var self = this;
	
	this.id = id + "actionbardiv";
		
	switch (style) {
		case "hud" : style = "dbactionbar hud"; break;
		case "mediabrowser" : style = "dbactionbar media"; break;
		default : style = "dbactionbar basis"; break;
	}
	
	this.scrollinfo = {
		scrollable: false,
		max: false,
		min: false
	};
		
	this.commandBarContainer = new Element(id + "actionbarcontainer",style,"div");
	this.commandBarContainer.object.additionalType = "actionbar";
	this.commandBarContainer.addStyle("overflow","hidden");
	
	this.commandBarLeft = new Element(id + "actionbaroverflowleft","dbactionbar overflowcontroler left inactive","div",this.commandBarContainer);
	this.commandBarLeft.text("&#x25C0;");
	this.commandBarLeft.addEvent("click",function () { self.variable.object.className = "transition"; self.scroll(100,"click"); });
	
	this.commandBarRight = new Element(id + "actionbaroverflowright","dbactionbar overflowcontroler right inactive","div",this.commandBarContainer);
	this.commandBarRight.text("&#x25B6;");
	this.commandBarRight.addEvent("click",function () { self.variable.object.className = "transition"; self.scroll(-100,"click"); });
	
	this.commandBar = new Element (id + "actionbar","dbactionbar content","div",this.commandBarContainer);
	this.commandBar.object.additionalType = "actionbar";
	this.commandBar.addStyle("overflow","hidden");
	this.commandBar.object.addEventListener("mousewheel",function (event) { 
		if (self.scrollinfo.scrollable) {
			var delta = event.detail ? event.detail : event.wheelDelta / 120; 
			self.scroll(delta,"mouse");
			event.preventDefault(); 
		}
		},false);
	this.commandBar.object.addEventListener("MozMousePixelScroll",function (event) { 
		if (self.scrollinfo.scrollable) {
			var delta = -event.detail; 
			self.scroll(delta,"mouse");
			event.preventDefault(); 
		}
		},false);
	
	this.commandBarSubContainer = new Element(id + "actionbarsubcontainer",false,"div",this.commandBar);
	
	this.static = new Element(id + "actionbarstatic",false,"div",this.commandBarSubContainer);
	this.variable = new Element(id + "actionbarvariable",false,"div",this.commandBarSubContainer);
	
	this.variable.object.addEventListener("webkitTransitionEnd",function () { self.variable.object.className = ""; },false);
}

CommandBar.prototype.show = function () {
	this.commandBarContainer.addStyle("display","block");
}

CommandBar.prototype.hide = function () {
	this.commandBarContainer.addStyle("display","none");
}

CommandBar.prototype.activateScrolling = function (min,max) {
	this.scrollinfo.scrollable = true;
	this.scrollinfo.min = typeof min !== "undefined" ? min : false;
	this.scrollinfo.max = typeof max !== "undefined" ? max : false;
	
	this.commandBarLeft.object.className = this.commandBarLeft.object.className.replace(" inactive"," active");
	this.commandBarRight.object.className = this.commandBarRight.object.className.replace(" inactive"," active");
		
	if (this.scrollinfo.max == "auto") {
		this.scrollinfo.max = parseInt(this.variable.getStyle("width")) - parseInt(this.commandBar.getStyle("width"));
	}
	
	if (parseInt(this.variable.getStyle("margin-left")) === min) {
		this.commandBarLeft.addStyle("color","rgba(0,0,0,0.35)");
	} else if (parseInt(this.variable.getStyle("margin-left")) === max) {
		this.commandBarRight.addStyle("color","rgba(0,0,0,0.35)");
	}
}

CommandBar.prototype.deactivateScrolling = function () {
	this.scrollinfo.scrollable = false;
	this.commandBarLeft.object.className = this.commandBarLeft.object.className.replace(" active"," inactive");
	this.commandBarRight.object.className = this.commandBarRight.object.className.replace(" active"," inactive");
}

CommandBar.prototype.clear = function () {
	this.deactivateScrolling();
	this.commandBarSubContainer.addStyle("margin-left","0px");
	this.variable.text("clear");
}

CommandBar.prototype.reset = function () {
	this.deactivateScrolling();
	this.variable.text("clear");
	this.static.text("clear");
}

CommandBar.prototype.scroll = function (pixels,method) {
	var self = this;

	if (typeof pixels != "number") {
		pixels = 100;
	}
		
	// get direction
	
	if (window.opera && method !== "click") {
		pixels = -pixels * 3;
	}
	
	var marginLeft = parseInt(this.variable.getStyle("margin-left"));
	var min = this.scrollinfo.min;
	var max = -this.scrollinfo.max;
	
	var position = marginLeft + pixels;
		
	if (min !== false && position > min) {
		position = min;
		this.commandBarRight.addStyle("color","#000");
		this.commandBarLeft.addStyle("color","rgba(0,0,0,0.35)");
	} else if (max !== false && position < max) {
		position = max;
		this.commandBarLeft.addStyle("color","#000");
		this.commandBarRight.addStyle("color","rgba(0,0,0,0.35)");
	} else {
		this.commandBarLeft.addStyle("color","#000");
		this.commandBarRight.addStyle("color","#000");
	}
		
	this.variable.addStyle("margin-left",position + "px");
}

CommandBar.prototype.addCommand = function (commands,type) {
	if (type == "variable") {
		this.clear();
		var containerWidth = 0;
		
		if (commands instanceof Array) {
			for (var i = 0; i < commands.length; i++) {
				this.variable.addStyle("width","auto");
				commands[i].addStyle("margin-right","5px");
				commands[i].object.additionalType = "actionbar";
				if (commands[i].labelalign) {
					var container = document.createElement("div");
					container.style.cssFloat = "left";
					this.variable.object.appendChild(container);
					
					if (commands[i].labelalign == "above" || commands[i].labelalign == "left") {
						commands[i].label.insert(container);
					}
					
					commands[i].insert(container);
					
					if (commands[i].labelalign == "right" || commands[i].labelalign == "below") {
						commands[i].label.insert(container);
					}
					
					container.style.marginTop = (33 - parseInt(commands[i].object.offsetHeight)) / 2 + "px";
					
					containerWidth += container.offsetWidth + parseInt(dodb(container).getStyle("padding-left")) + parseInt(dodb(container).getStyle("padding-right"));
					
					this.variable.addStyle("width",containerWidth + "px");
				} else {
					commands[i].insert(this.variable);
					commands[i].addStyle("float","left");
					commands[i].addStyle("margin-top",(33 - parseInt(commands[i].object.offsetHeight)) / 2 + "px");
					
					containerWidth += commands[i].object.offsetWidth + 5;
					
					this.variable.addStyle("width",containerWidth + "px");
				}
				
			}
		}
		
		if (this.commandBar.getAvailibleWidth() < containerWidth) {
			this.activateScrolling(0,"auto");
		}
		
	} else if (type == "static") {
		this.clear();
		if (commands instanceof Array) {
			for (var i = 0; i < commands.length; i++) {
				commands[i].addStyle("margin-right","5px");
				commands[i].object.additionalType = "actionbar";
				if (commands[i].labelalign) {
					var container = document.createElement("div");
					container.style.cssFloat = "left";
					this.static.object.appendChild(container);
					
					if (commands[i].labelalign == "above" || commands[i].labelalign == "left")
						commands[i].label.insert(container);
					
					commands[i].insert(container);
					
					if (commands[i].labelalign == "right" || commands[i].labelalign == "below")
						commands[i].label.insert(container);
					
					container.style.marginTop = (33 - parseInt(commands[i].object.offsetHeight)) / 2 + "px";
				} else {
					commands[i].insert(this.static);
					var height = commands[i].tag == "select" ? 18 : parseInt(commands[i].object.offsetHeight);
					if (commands[i].type == "search")
						commands[i].addStyle("float","right");
					else
						commands[i].addStyle("float","left");
					commands[i].addStyle("margin-top",(33 - height) / 2 + "px");
				}
			}
		}
	}
}

function Resizer (id,type,position) {
	this.position = position;
	this.type = type;
	if (this.type == "hud") {
		this.resizer = new Element("db" + id + "hudresize","dbhudresize","div");
	}
}

function ResizeObject (object,type,position) {
	this.position = position;
	this.type = type;
	this.resizer = object;
}



var drag = {
	counter:0,
	dragobject:null,
	dragx:0,
	dragy:0,
	left:0,
	right:0,
	top:0,
	posx:0,
	posy:0,
	marginx:0,
	marginy:0,
	width:0,
	height:0,
	float:false,
	lastFloatTarget:null,
	newPositionX:0,
	newPositionY:0,
	actualPositionX:0,
	actualPositionY:0,
	directionX:null,
	directionY:null,
	forbiddenX:false,
	forbiddenY:false,
	maxPositions:false,
	magneticLinesEnabled:false,
	magneticObjects:[],
	magneticPositions:[],
	magneticRadius:8,
	init: function (object,x,y,maxPositions,float,magneticLinesEnabled,magneticObjects) {
		if (drag.dragobject != null)
			drag.stop();
		drag.dragobject = object.style ? dodb(object) : object;
		
		if (drag.dragobject.ondragstart instanceof Function)
			drag.dragobject.ondragstart();
		else if (drag.dragobject.ondragstart instanceof Array)
			drag.dragobject.ondragstart[0].call(drag.dragobject.ondragstart[1]);
		
		drag.float = float ? float : false;
		
		if (drag.float instanceof Array) {
			drag.floatObjects = {
				rows:[],
				overview:[]
			}
			
			drag.dragobject.addStyle("display","none");
			
			if (drag.float[0] instanceof Array) {
				if (drag.float[0].length == drag.float[1].length) {
					for (var i = 0; i < drag.float[0].length; i++) {
						
						var lastTop = 0;
						var rowsLength = 0;
						
						if (drag.float[1][i] == "next") {
							for (var j = 0; j < drag.float[0][i].childNodes.length; j++) {
								if (drag.float[0][i].childNodes[j].nodeType == 3 || drag.float[0][i].childNodes[j].style.display == "none") continue;
								
								if (dodb(drag.float[0][i].childNodes[j]).getContentPosition("top") != lastTop) {
									lastTop = dodb(drag.float[0][i].childNodes[j]).getContentPosition("top");
									var objectHeight = drag.float[0][i].childNodes[j].offsetHeight;
									
									drag.floatObjects.overview[rowsLength] = [lastTop,lastTop + parseInt(objectHeight)];
									drag.floatObjects.rows[rowsLength] = [];
									
									rowsLength++;
								}
								
								var totalPosX = typeof drag.float[0][i].childNodes[j + 1] == "undefined" ? dodb(drag.float[0][i].childNodes[j]).getContentPosition("left") : dodb(drag.float[0][i].childNodes[j]).getContentPosition("left") + parseInt(drag.float[0][i].childNodes[j].offsetWidth);
								
								var objectarray = [drag.float[0][i].childNodes[j],
												   dodb(drag.float[0][i].childNodes[j]).getContentPosition("left"),
												   totalPosX
								];
								drag.floatObjects.rows[rowsLength - 1].push(objectarray);
							}
						} else if (drag.float[1][i] == false) {
							drag.floatObjects.push(drag.float[0][i]);
							drag.floatObjectsPosX.push(dodb(drag.float[0][i]).getContentPosition("left"));
							drag.floatObjectsPosY.push(dodb(drag.float[0][i]).getContentPosition("top"));
						}
					}
				}
			}
			
			drag.dragobject.addStyle("display","block");
			
			drag.helpElement = drag.dragobject.object.cloneNode(true);
			dodb(drag.helpElement).addEvent("mouseup",function () { 
											var event = document.createEvent("MouseEvents");
											event.initMouseEvent("click",true,true,window,0,0,0,0,0,false,false,false,false,0,null);
											drag.dragobject.object.firstChild.dispatchEvent(event); 
											});
			if (drag.helpElement.firstChild.tagName.toLowerCase() == "canvas") {
				var context = drag.helpElement.firstChild.getContext("2d");
				context.drawImage(drag.dragobject.object.firstChild,0,0,parseInt(dodb(drag.dragobject.object.firstChild).getAttribute("width")),parseInt(dodb(drag.dragobject.object.firstChild).getAttribute("height")));
			}
			
			
			dodb(drag.helpElement).insert(drag.dragobject.object.parentNode,drag.dragobject);
			dodb(drag.helpElement).addStyle(["position","left","top","z-index","margin"],["absolute",dodb(drag.helpElement).getContentPosition("left") + "px",dodb(drag.helpElement).getContentPosition("top") + "px","1","0px"]);
			drag.dragobject.addStyle(["z-index","visibility"],["2","hidden"]);
		}
		
		var object = drag.helpElement ? dodb(drag.helpElement) : drag.dragobject;
		
		if (object.getStyle("position") != "relative") { 
			object.addStyle("position","absolute");
			drag.left = parseInt(object.getContentPosition("left"));
			drag.top = parseInt(object.getContentPosition("top"));
			object.addStyle(["left","top","margin"],[drag.left + "px",drag.top + "px","0px"]);
		} else {
			drag.left = object.getStyle("left") == "auto" ? 0 : parseInt(object.getStyle("left"));
			drag.top = object.getStyle("top") == "auto" ? 0 : parseInt(object.getStyle("top"));
		}
		
		drag.right = drag.dragobject.object.parentNode.offsetWidth - drag.dragobject.object.offsetWidth - drag.left;
		
		drag.dragx = x;
		drag.dragy = y;
		drag.actualPositionX = drag.left;
		drag.actualPositionY = drag.top;

		if (typeof(maxPositions) != "undefined") {
			var top = maxPositions[0] ? (drag.top - maxPositions[0]) : false;
			var right = maxPositions[1] ? (drag.left + maxPositions[1]) : false;
			var bottom = maxPositions[2] ? (drag.top + maxPositions[2]) : false;
			var left = maxPositions[3] ? (drag.left - maxPositions[3]) : false;
			drag.maxPositions = [top,right,bottom,left];
		}
		/*drag.magneticLinesEnabled = magneticLinesEnabled;
		drag.magneticObjects = magneticObjects;
		if (drag.magneticLinesEnabled == true && drag.magneticObjects.length > 0) {
			for (var i = 0; i < drag.magneticObjects.length; i++) {
		*/
		
		
		dodb(document.getElementsByTagName("body")[0]).addStyle(["-webkit-user-select","-moz-user-select"],["none","none"]);
		document.onmousemove = drag.drag;
		document.onmouseup = drag.stop;
		return false;
	},
	drag: function (ereignis) {
		if (drag.firstmove) {
			
		}
		
		ereignis = ereignis ? ereignis : window.event; 
		drag.posx = ereignis.pageX;
		drag.posy = ereignis.pageY;
		
		var object = drag.helpElement ? dodb(drag.helpElement) : drag.dragobject;
		
		if (object.getStyle("position") == "relative") {
			drag.left = parseInt(object.getStyle("left"));
			drag.top = parseInt(object.getStyle("top"));
			drag.right = drag.dragobject.object.parentNode.offsetWidth - drag.dragobject.object.offsetWidth - drag.left;
		} else {
			drag.left = parseInt(object.getContentPosition("left"));
			drag.top = parseInt(object.getContentPosition("top"));
			drag.right = drag.dragobject.object.parentNode.offsetWidth - drag.dragobject.object.offsetWidth - drag.left + parseInt(dodb(drag.dragobject.object.parentNode).getContentPosition("left"));
		}
		
		
		drag.newPositionX = drag.left + (drag.posx - drag.dragx);
		drag.newPositionY = drag.top + (drag.posy - drag.dragy);
		drag.directionX = ((drag.posx - drag.dragx) < 0) ? "left" : "right";
		drag.directionY = ((drag.posy - drag.dragy) < 0) ? "top" : "bottom";
		drag.actualPositionX = drag.actualPositionX + (drag.posx - drag.dragx);
		drag.actualPositionY = drag.actualPositionY + (drag.posy - drag.dragy);
		
		if (drag.float instanceof Array) {
			
			
			var helpElement = dodb(drag.helpElement);
			
			if (drag.maxPositions && drag.maxPositions[0] != false && drag.maxPositions[1] != false && drag.maxPositions[2] != false && drag.maxPositions[3] != false) {
				if (drag.maxPositions[0] < drag.newPositionY)
					drag.dodrag(dodb(drag.helpElement),false,"top");
				else
					drag.forbiddenY = "top";
				
				if (drag.maxPositions[2] > drag.newPositionY)
					drag.dodrag(dodb(drag.helpElement),false,"bottom");
				else
					drag.forbiddenY = "bottom";
				
				if (drag.maxPositions[1] > drag.newPositionX)
					drag.dodrag(dodb(drag.helpElement),"right",false);
				else
					drag.forbiddenX = "right";
				
				if (drag.maxPositions[3] < drag.newPositionX)
					drag.dodrag(dodb(drag.helpElement),"left",false);
				else
					drag.forbiddenX = "left";
					
			} else {
				drag.dodrag(helpElement,true,true);
			}
			
			
			var helpElementPosX = helpElement.getContentPosition("left");
			var helpElementPosY = helpElement.getContentPosition("top");
			
			var position = 0;
						
			if (helpElementPosY < drag.floatObjects.overview[0][1]) {
				drag.dragobject.remove();
				drag.dragobject.insert(drag.floatObjects.rows[0][0][0].parentNode,drag.floatObjects.rows[0][0][0]);
				drag.dragobject.object.dragPositionFloat = 0;
			} else if (helpElementPosY > drag.floatObjects.overview[drag.floatObjects.overview.length - 1][1]) {
				drag.dragobject.remove();
				drag.dragobject.insert(drag.floatObjects.rows[0][0][0].parentNode.parentNode);
				drag.dragobject.object.dragPositionFloat = "last";
			} else {
				for (var i = 0; i < drag.floatObjects.overview.length; i++) {
					position += drag.floatObjects.rows[i].length;
					if (helpElementPosY > drag.floatObjects.overview[i][0] && helpElementPosY < drag.floatObjects.overview[i][1]) {
												
						if (helpElementPosX < drag.floatObjects.rows[i][0][1]) {
							drag.dragobject.remove();
							drag.dragobject.insert(drag.floatObjects.rows[i][0][0].parentNode,drag.floatObjects.rows[i][0][0]);
							drag.dragobject.object.dragPositionFloat = position;
						} else if (helpElementPosX > drag.floatObjects.rows[i][drag.floatObjects.rows[i].length - 1][2]) {
							drag.dragobject.remove();
							if (typeof drag.floatObjects.rows[i + 1] == "undefined") {
								drag.dragobject.insert(drag.floatObjects.rows[i][drag.floatObjects.rows[i].length - 1][0].parentNode);
								drag.dragobject.object.dragPositionFloat = position;
							} else {
								drag.dragobject.insert(drag.floatObjects.rows[i][drag.floatObjects.rows[i].length - 1][0].parentNode,drag.floatObjects.rows[i + 1][0][0]);
								drag.dragobject.object.dragPositionFloat = position;
							}
						} else {
							position -= drag.floatObjects.rows[i].length;
							for (var j = 0; j < drag.floatObjects.rows[i].length; j++) {
								position++;
								if (helpElementPosX > drag.floatObjects.rows[i][j][1] && helpElementPosX < drag.floatObjects.rows[i][j][2]) {
									drag.dragobject.remove();
									if (typeof drag.floatObjects.rows[i][j+1] == "undefined") {
										drag.dragobject.insert(drag.floatObjects.rows[i][j][0].parentNode);
										drag.dragobject.object.dragPositionFloat = position;
									} else {
										drag.dragobject.insert(drag.floatObjects.rows[i][j][0].parentNode,drag.floatObjects.rows[i][j][0]);
										drag.dragobject.object.dragPositionFloat = position;
									}
									var match = true;
									break;
								}
							}
						}
					}
				}
			}
		} else {
			if (drag.maxPositions && drag.maxPositions[0] != false && drag.maxPositions[1] != false && drag.maxPositions[2] != false && drag.maxPositions[3] != false) {
				if (drag.maxPositions[0] < drag.newPositionY)
					drag.dodrag(drag.dragobject,false,"top");
				else
					drag.forbiddenY = "top";
				
				if (drag.maxPositions[2] > drag.newPositionY)
					drag.dodrag(drag.dragobject,false,"bottom");
				else
					drag.forbiddenY = "bottom";
				
				if (drag.maxPositions[1] > drag.newPositionX)
					drag.dodrag(drag.dragobject,"right",false);
				else
					drag.forbiddenX = "right";
				
				if (drag.maxPositions[3] < drag.newPositionX)
					drag.dodrag(drag.dragobject,"left",false);
				else
					drag.forbiddenX = "left";
				
			} else {
				drag.dodrag(drag.dragobject,true,true);
			}
		}
		
		if (drag.helpElement) {
			var pos = dodb(drag.helpElement).getContentPosition();
			var left = parseInt(drag.dragobject.getStyle("margin-left")) - drag.dragobject.getContentPosition("left") + pos[0]; // WIESO SO KOMPLIZIERT - IM NÄCHSTEN BUILD BEACHTEN UND GEGEBENENFALLS ÄNDERN!
			var top = - drag.dragobject.getContentPosition("top") + pos[1];
			var right = drag.right;
			
			
			if (drag.dragobject.getStyle("float") == "right") {
				drag.dragobject.addStyle(["margin-right","margin-top"],[right + "px",parseInt(drag.dragobject.getStyle("margin-top")) + top + "px"]);
			} else {
				drag.dragobject.addStyle(["margin-left","margin-top"],[left + "px",parseInt(drag.dragobject.getStyle("margin-top")) + top + "px"]);
			}
		}
		
		drag.dragx = ereignis.pageX;
		drag.dragy = ereignis.pageY;
		
	},
	dodrag: function (object,left,top) {
		if (left == "right" && drag.newPositionX >= drag.actualPositionX && drag.forbiddenX != "left")
			object.addStyle("left",drag.actualPositionX + "px");
		if (left == "left" && drag.newPositionX <= drag.actualPositionX && drag.forbiddenX != "right")
			object.addStyle("left",drag.actualPositionX + "px");
		
		if (top == "top" && drag.newPositionY <= drag.actualPositionY && drag.forbiddenY != "bottom")
			object.addStyle("top",drag.actualPositionY + "px");
		if (top == "bottom" && drag.newPositionY >= drag.actualPositionY && drag.forbiddenY != "top")
			object.addStyle("top",drag.actualPositionY + "px");
		
		if (left == true)
			object.addStyle("left",drag.actualPositionX + "px");
		if (top == true)
			object.addStyle("top",drag.actualPositionY + "px");
	},
	stop: function () {
		dodb(document.getElementsByTagName("body")[0]).addStyle(["-webkit-user-select","-moz-user-select"],["auto","auto"]);
		document.onmousemove = null;
		document.onmouseup = null;
		
		if (drag.helpElement) {
			dodb(drag.helpElement).remove();
			drag.helpElement = null;
			drag.dragobject.addStyle("visibility","visible");
		}
		
		drag.dragobject.right = drag.right;
		
		if (drag.dragobject.ondragstop instanceof Function)
			drag.dragobject.ondragstop();
		else if (drag.dragobject.ondragstop instanceof Array)
			drag.dragobject.ondragstop[0].call(drag.dragobject.ondragstop[1]);
					
		
		drag.dragobject = null;
	}
}
var resize = {
	fireElement:null,
	resizeobject:null,
	height:0,
	width:0,
	posx:0,
	posy:0,
	resizex:0,
	resizey:0,
	maxSize:false,
	minSize:false,
	direction:"all",
	factor:0,
	addedWidth:0,
	addedHeight:0,
	hasResized:false,
	proportion:false,
	init: function (fireElement,object,x,y) {
		if (resize.resizeobject != null)
			resize.stop();
		resize.fireposition = fireElement.position;
		resize.fireElement = fireElement.resizer ? fireElement.resizer : false;
		resize.resizeobject = object.style ? dodb(object) : object;
		
		//resize.resizeobject.addEvent("mousedown",function (event) { re });
		
		if (resize.resizeobject.onresizestart instanceof Function)
			resize.resizeobject.onresizestart();
		else if (resize.resizeobject.onresizestart instanceof Array)
			resize.resizeobject.onresizestart[0].call(resize.resizeobject.onresizestart[1]);
		
		resize.width = parseInt(resize.resizeobject.getStyle("width")) !== 0 ? parseInt(resize.resizeobject.getStyle("width")) : parseInt(resize.resizeobject.getDeclaredStyle("width"));
		resize.height = parseInt(resize.resizeobject.getStyle("height")) !== 0 ? parseInt(resize.resizeobject.getStyle("height")) : parseInt(resize.resizeobject.getDeclaredStyle("height"));
		resize.actualWidth = resize.width;
		resize.actualHeight = resize.height;
		resize.factor = resize.width / resize.height;
		resize.minSize = resize.resizeobject.resizeProperties.minSize ? resize.resizeobject.resizeProperties.minSize : [0,0];
		resize.maxSize = resize.resizeobject.resizeProperties.maxSize ? resize.resizeobject.resizeProperties.maxSize : [10000,10000];
		resize.proportion = resize.resizeobject.resizeProperties.proportion;
		if (resize.minSize)
			resize.resizeobject.addStyle(["min-width","min-height"],[resize.minSize[0] + "px",resize.minSize[1] + "px"]);
		if (resize.maxSize)
			resize.resizeobject.addStyle(["max-width","max-height"],[resize.maxSize[0] + "px",resize.maxSize[1] + "px"]);
		resize.resizex = x;
		resize.resizey = y;
		resize.direction = resize.resizeobject.resizeProperties.direction ? resize.resizeobject.resizeProperties.direction : "all";
		dodb(document.getElementsByTagName("body")[0]).addStyle(["-webkit-user-select","-moz-user-select"],["none","none"]);
		document.onmousemove = resize.resize;
		document.onmouseup = resize.stop;
		return false;
	},
	resize: function (event) {
		event = event ? event : window.event;
		resize.posx = event.pageX;
		resize.posy = event.pageY;
		resize.addedWidth = resize.posx - resize.resizex;
		resize.addedHeight = resize.posy - resize.resizey;
		
		resize.hasResized = false;
				
		if (resize.proportion) {
			if (resize.fireposition == "bottom right") {
				if (resize.direction == "horizontal") {
					resize.addedHeight = resize.addedWidth / resize.factor;
				} else if (resize.direction == "vertical") {
					resize.addedWidth = resize.addedHeight * resize.factor;
				} else if (resize.direction == "all") {
					if (Math.abs(resize.addedWidth) < Math.abs(resize.addedHeight))
						resize.addedWidth = resize.addedHeight * resize.factor;
					else
						resize.addedHeight = resize.addedWidth / resize.factor;
				}
			} else if (resize.fireposition == "bottom center") {
				if (resize.direction == "vertical" || resize.direction == "all") {
					resize.addedWidth = resize.addedHeight * resize.factor;
					resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) - resize.addedWidth/2 + "px");
				}
			} else if (resize.fireposition == "top center") {
				if (resize.direction == "vertical" || resize.direction == "all") {
					resize.addedHeight = -resize.addedHeight;
					resize.addedWidth = resize.addedHeight * resize.factor;
					resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) - resize.addedWidth/2 + "px");
					resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) - resize.addedHeight + "px");
				}
			} else if (resize.fireposition == "top right") {
				if (resize.direction == "horizontal") {
					resize.addedHeight = resize.addedWidth / resize.factor;
				} else if (resize.direction == "vertical") {
					resize.addedHeight = -resize.addedHeight;
					resize.addedWidth = resize.addedHeight * resize.factor;
				} else if (resize.direction == "all") {
					if (Math.abs(resize.addedWidth) < Math.abs(resize.addedHeight)) {
						resize.addedHeight = -resize.addedHeight;
						resize.addedWidth = resize.addedHeight * resize.factor;
					} else
						resize.addedHeight = resize.addedWidth / resize.factor;
				}					
				resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) - resize.addedHeight + "px");
			} else if (resize.fireposition == "bottom left") {
				if (resize.direction == "horizontal") {
					resize.addedWidth = -resize.addedWidth;
					resize.addedHeight = resize.addedWidth / resize.factor;
				} else if (resize.direction == "vertical") {
					resize.addedWidth = resize.addedHeight * resize.factor;
				} else if (resize.direction == "all") {
					if (Math.abs(resize.addedWidth) < Math.abs(resize.addedHeight)) {
						resize.addedWidth = resize.addedHeight * resize.factor;
					} else {
						resize.addedWidth = -resize.addedWidth;
						resize.addedHeight = resize.addedWidth / resize.factor;
					}
				}					
				resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) - resize.addedWidth + "px");
			} else if (resize.fireposition == "top left") {
				if (resize.direction == "horizontal") {
					resize.addedHeight = -resize.addedHeight;
					resize.addedHeight = resize.addedWidth / resize.factor;
				} else if (resize.direction == "vertical") {
					resize.addedWidth = resize.addedHeight * resize.factor;
				} else if (resize.direction == "all") {
					if (Math.abs(resize.addedWidth) < Math.abs(resize.addedHeight)) {
						resize.addedHeight = -resize.addedHeight;
						resize.addedWidth = resize.addedHeight * resize.factor;
					} else {
						resize.addedWidth = -resize.addedWidth;
						resize.addedHeight = resize.addedWidth / resize.factor;
					}
				}
				resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) - resize.addedHeight + "px");
				resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) - resize.addedWidth + "px");
			} else if (resize.fireposition == "middle left") {
				if (resize.direction == "horizontal" || resize.direction == "all") {
					resize.addedWidth = -resize.addedWidth;
					resize.addedHeight = resize.addedWidth / resize.factor;
					resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) - resize.addedWidth + "px");
					resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) - resize.addedHeight/2 + "px");
				}
			} else if (resize.fireposition == "middle right") {
				if (resize.direction == "horizontal" || resize.direction == "all") {
					resize.addedHeight = resize.addedWidth / resize.factor;
					resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) - resize.addedHeight/2 + "px");
				}
			}
			
			
			resize.actualWidth = resize.actualWidth + resize.addedWidth;
			resize.actualHeight = resize.actualHeight + resize.addedHeight;
			
			if (resize.actualWidth < resize.maxSize[0] && resize.actualHeight < resize.maxSize[1] && resize.actualWidth > resize.minSize[0] && resize.actualHeight > resize.minSize[1]) {
				resize.width = resize.actualWidth;
				resize.height = resize.actualHeight;
				resize.hasResized = true;
			}
			
			resize.resizeobject.addStyle(["width","height"],[Math.round(resize.width) + "px",Math.round(resize.height) + "px"]);
		} else {
			if (resize.direction == "horizontal" || resize.direction == "all") {
				if (resize.fireposition != "top center" && resize.fireposition != "bottom center") {
					if (resize.fireposition == "bottom left" || resize.fireposition == "top left" || resize.fireposition == "middle left") {
						resize.resizeobject.addStyle("width",resize.width - Math.round(resize.addedWidth) + "px");
						resize.width = resize.width - resize.addedWidth;
						resize.resizeobject.addStyle("left",parseInt(resize.resizeobject.getStyle("left")) + resize.addedWidth + "px");
					} else {
						resize.actualWidth = resize.actualWidth + resize.addedWidth;
						if (resize.actualWidth < resize.maxSize[0] && resize.actualWidth > resize.minSize[0]) {
							resize.width = resize.actualWidth;
							resize.hasResized = true;
						}
						resize.resizeobject.addStyle("width",Math.round(resize.width) + "px");
					}
				}
			}
			if (resize.direction == "vertical" || resize.direction == "all") {
				if (resize.fireposition != "middle left" && resize.fireposition != "middle right") {
					if (resize.fireposition == "top left" || resize.fireposition == "top center" || resize.fireposition == "top right") {
						resize.resizeobject.addStyle("height",resize.height - Math.round(resize.addedHeight) + "px");
						resize.height = resize.height - resize.addedHeight;
						resize.resizeobject.addStyle("top",parseInt(resize.resizeobject.getStyle("top")) + resize.addedHeight + "px");
					} else {
						resize.actualHeight = resize.actualHeight + resize.addedHeight;
						if (resize.actualHeight < resize.maxSize[1] && resize.actualHeight > resize.minSize[1]) {
							resize.height = resize.actualHeight;
							resize.hasResized = true;
						}
						resize.resizeobject.addStyle("height",resize.height + Math.round(resize.addedHeight) + "px");
					}
				}
			}
		}
		if (resize.fireElement) {
			if (resize.proportion && (resize.width < resize.maxSize[0] && resize.width > resize.minSize[0]) && (resize.height < resize.maxSize[1] && resize.height > resize.minSize[1])) {
				resize.fireElement.addStyle("left",parseInt(resize.fireElement.getStyle("left")) + Math.round(resize.addedWidth) + "px");
				resize.fireElement.addStyle("top",parseInt(resize.fireElement.getStyle("top")) + Math.round(resize.addedHeight) + "px");
			} else {
				if ((resize.direction == "horizontal" || resize.direction == "all") && (resize.width < resize.maxSize[0] && resize.width > resize.minSize[0])) {
					resize.fireElement.addStyle("left",parseInt(resize.fireElement.getStyle("left")) + Math.round(resize.addedWidth) + "px");
				}
				if ((resize.direction == "vertical" || resize.direction == "all") && (resize.height < resize.maxSize[1] && resize.height > resize.minSize[1]))
					resize.fireElement.addStyle("top",parseInt(resize.fireElement.getStyle("top")) + Math.round(resize.addedHeight) + "px");
			}
		}
		resize.resizex = event.pageX;
		resize.resizey = event.pageY;
		
		var event = {
			object : resize.resizeobject,
			x : resize.addedWidth,
			y : resize.addedHeight,
			hasResized : resize.hasResized
		}
		
		if (resize.resizeobject.onresize instanceof Function) {
			resize.resizeobject.onresize(event);
		} else if (resize.resizeobject.onresize instanceof Array) {
			resize.resizeobject.onresize[0].call(resize.resizeobject.onresize[1],event); 
		}
		
		return false;
	},
	stop: function () {
		dodb(document.getElementsByTagName("body")[0]).addStyle(["-webkit-user-select","-moz-user-select"],["auto","auto"]);
		
		if (resize.resizeobject.onresizestop instanceof Function)
			resize.resizeobject.onresizestop();
		else if (resize.resizeobject.onresizestop instanceof Array)
			resize.resizeobject.onresizestop[0].call(resize.resizeobject.onresizestop[1]);
		
		resize.resizeobject = null;
		document.onmousemove = null;
		document.onmouseup = null;
		return false;
	}
}


var Storage = {
	database : {
		databases : [],
		Database : function (shortName,version,displayName,expectedSize) {
			this.supported = true;
			this.supporter = false;
			this.usesPlugin = false;
			this.shortName = shortName;
			this.version = version;
			this.displayName = displayName;
			this.expectedSize = expectedSize;
			if (window.openDatabase) {
				this.database = openDatabase(this.shortName,this.version,this.displayName,this.expectedSize);
				this.supporter = "webkit";
				Storage.database.databases[Storage.database.databases.length] = this.database;
			} else if (typeof(google) != "undefined") {
				this.supporter = "google";
				this.usesPlugin = true;
				this.database = google.gears.factory.create("beta.database");
				this.database.open(this.shortName);
			} else {
				this.supported = false;
			}
		}
	},
	local : {
		supported : typeof(localStorage) != "undefined" ? true : false,
		//length : localStorage.length,
		
		save : function (id,value) {
			if (id && value) {
				if (Storage.local.supported) {
					try {
						localStorage.setItem(id,value);
						return true;
					} catch (e) {
						throw "DOM-Fehler: Das Objekt konnte nicht gespeichert werden. Übergebene Parameter: ID: " + id + " Value: " + value + ". Folgender Fehler wurde vom Browser gemeldet: " + e;
					}
				} else
					throw "Browserfehler: Ihr Browser unterstützt den lokalen HTML5-Speicher nicht.";
			} else {
				if (id)
					throw "Parserfehler: Value ist nicht definiert.";
				else
					throw "Parserfehler: ID ist nicht definiert.";
			}
		},
		
		get : function (id) {
			if (Storage.local.supported)
				return localStorage.getItem(id);
			else
				throw "Browserfehler: Ihr Browser unterstützt den lokalen HTML5-Speicher nicht.";
		},
		
		remove : function (id) {
			if (Storage.local.supported) {
				if (id != "all") {
					try {
						localStorage.removeItem(id);
						return true;
					} catch (e) {
						throw "DOM-Fehler: Das Objekt konnte nicht gelöscht werden. Übergebene Parameter: ID: " + id + ". Folgender Fehler wurde vom Browser gemeldet: " + e;
					}
				} else {
					localStorage.clear();
					return true;
				}
			} else
				throw "Browserfehler: Ihr Browser unterstützt den lokalen HTML5-Speicher nicht.";
		}
	},	
	session: {
		supported : (window.sessionStorage) ? true : false,
		//length : Storage.session.supported ? window.sessionStorage.length : null,
		
		save : function (id,value) {
			if (id && value) {
				if (Storage.session.supported) {
					try {
						sessionStorage.setItem(id,value);
						return true;
					} catch (e) {
						throw "DOM-Fehler: Das Objekt konnte nicht gespeichert werden. Übergebene Parameter: ID: " + id + " Value: " + value + ". Folgender Fehler wurde vom Browser gemeldet: " + e;
					}
				} else
					return "Browserfehler: Ihr Browser unterstützt den HTML5-Sitzungsspeicher nicht.";
			} else {
				if (id)
					throw "Parserfehler: Value ist nicht definiert. Übergebene ID: " + id;
				else
					throw "Parserfehler: ID ist nicht definiert.";
			}
		},
		
		get : function (id) {
			if (Storage.session.supported)
				return sessionStorage.getItem(id);
			else
				console.error("Browserfehler: Ihr Browser unterstützt den HTML5-Sitzungsspeicher nicht.");
		},
		
		remove : function (id) {
			if (Storage.session.supported) {
				if (id != "all") {
					try {
						sessionStorage.removeItem(id);
						return true;
					} catch (e) {
						throw "DOM-Fehler: Das Objekt konnte nicht gelöscht werden. Übergebene Parameter: ID: " + id + ". Folgender Fehler wurde vom Browser gemeldet: " + e;
					}
				} else {
					sessionStorage.clear();
					return true;
				}
			} else
				throw "Browserfehler: Ihr Browser unterstützt den HTML5-Sitzungsspeicher nicht.";
		}
	},
	
	//Session-Methoden
	cache : function (type,id,value) {
		if (type == "session" && Storage.session.supported)
			Storage.session.save(id,value);
		else if (type == "local" || !Storage.session.supported)
			Storage.local.save(id,value);
		else
			throw "Parserfehler: Type wurde falsch übergeben.";
	},
	get : function (type,id) {
		if (type == "session"  && Storage.session.supported)
			return Storage.session.get(id);
		else if (type == "local" || !Storage.session.supported)
			return Storage.local.get(id);
		else
			throw "Parserfehler: Type wurde falsch übergeben.";
	},
	remove : function (type,id) {
		if (type == "session" && Storage.session.supported)
			Storage.session.remove(id);
		else if (type == "local" || !Storage.session.supported)
			Storage.local.remove(id);
		else
			throw "Parserfehler: Type wurde falsch übergeben.";
	},
	
	//Datenbank-Methoden
	
	newDB : function (shortName,version,displayName,expectedSize) {
		return new Storage.database.Database(shortName,version,displayName,expectedSize);
	}
}

Storage.database.Database.prototype.query = function (query,variables,handler,errorhandler) {
	if (this.supported == false)
		return false;
	if (typeof(errorhandler) == "undefined")
		errorhandler = this.errorhandler;
	if (this.supporter == "webkit")	
		this.database.transaction(function (tx) { tx.executeSql(query,variables,handler,errorhandler); });
	else if (this.supporter == "google") {
		//alert(query);
		var results = this.database.execute(query,variables);
		if (handler instanceof Function)
			handler(false,results);
	}
},

Storage.database.Database.prototype.errorhandler = function (tx,error) {
	throw "Datenbankfehler: " + error.message;
}

var Cache = {
	cache : function (objects) {
		if (objects instanceof Array) {
			for (var i = 0; i < objects.length; i++) {
				var j = i;
				switch (objects[i][1]) {
					case "input" : 
						if (objects[j][0].object.value != "")
							Storage.cache("session",global.activeWindow + ";input;" + objects[i][0].id,objects[i][0].object.value.toString()); 
						else 
							Cache.remove(global.activeWindow + ";input;" + objects[i][0].id);
						break;
					
					case "button" : 
						Storage.cache("session",global.activeWindow + ";button;" + objects[i][0].id,objects[i][0].active.toString()); break;
					
					case "tab" : 
						Storage.cache("session",global.activeWindow + ";tab;" + objects[i][0].id,objects[i][0].active.toString()); break;
						
					case "mediabrowser" :
						if (objects[i][0].selectedImages) {
							Storage.cache("session",global.activeWindow + ";mediabrowser;" + objects[i][0].id,objects[i][0].lastSearch + ";" + objects[i][0].selectedImages.toString());
						}
						break;
						
					case "media" :
						// Beispiel: "addarticle;media;bild.jpg" : "'image';500;500;true;0.2;false;0;10;'left';true;88"
						Storage.cache("session",global.activeWindow + ";media;" + objects[i][0].src,objects[i][0].type + ";" + objects[i][0].width + ";" + objects[i][0].height + ";" + objects[i][0].resizeProportion + ";" + objects[i][0].opacity + ";" + objects[i][0].shadow + ";" + objects[i][0].marginLeft + ";" + objects[i][0].marginTop + ";" + objects[i][0].float + ";" + objects[i][0].offset + ";" + objects[j][0].object.parentNode.dragPositionFloat); 
						break;
					case "hud" : 
						if (objects[i][0].opened)
							Storage.cache("session",global.activeWindow + ";hud;" + objects[i][0].id,objects[i][0].opened.toString() + ";" + objects[i][0].window.object.offsetWidth + ";" + objects[i][0].window.object.offsetHeight + ";" + objects[i][0].window.getPosition("left") + ";" + objects[i][0].window.getPosition("top"));
						else
							Storage.cache("session",global.activeWindow + ";hud;" + objects[i][0].id,"false;" + "false;" + "false;" + "false;" + "false");
						break;
				}
			}
		}
	},
	cacheAll : function () {
		Cache.cache(global.usedObjects);
	},
	cacheByType : function (type) {
		var objectsToCache;
		if (type instanceof Array) {
			for (var i = 0; i < type.length; i++) {
				for (var j = 0; j < global.usedObjects; j++) {
					if (global.usedObjects[j][1] == type[i])
						objectsToCache = global.usedObjects[j];
				}
			}
		} else {
			for (var i = 0; i < global.usedObjects; i++) {
				if (global.usedObjects[i][1] == type)
					objectsToCache = global.usedObjects[i];
			}
		}
		Cache.cache(objectsToCache);
	},
	get : function (id) {
		return Storage.get("session",id);
	},
	remove : function (id) {
		Storage.remove("session",id);
	},
	removeByActiveWindow : function (activeWindow) {
		for (var property in sessionStorage) {
			if (property.search(activeWindow + ";")) {
				Storage.remove("session",property);
			}
		}
	}
}

Math.shorten = function (a,b) {
	var greater,
		shorter,
		mod;
	
	if (a === b) {
		return [a,b];
	}
	
	if (a > b) {
		greater = a;
		shorter = b;
	} else if (b > a) {
		greater = b;
		shorter = a;
	}
	
	
	while (mod = (greater % shorter) !== 0) {
		greater = shorter;
		shorter = mod;
	}
	
	a = a / shorter;
	b = b / shorter;
	
	return [a,b];
}

Object.prototype.observe = function (property,handler) {
	var tempValue,
		oldValue;
		
	tempValue = this[property] || undefined;
	
	if ("defineProperty" in Object) {
		Object.defineProperty(this,property,{
			set : function (value) {
				oldValue = tempValue;
				tempValue = value;
				if (typeof handler === "function") {
					handler({ data : value, olddata : oldValue });
				}
			},
			get : function () {
				return tempValue;
			}
		});
	} else if ("__defineSetter" in this && "__defineGetter__" in this) {
		this.__defineSetter__(property,function (value) {
			oldValue = tempValue;
			tempValue = value;
			handler({ data : value, olddata : oldValue });
		});
		this.__defineGetter__(property,function () {
			return tempValue;
		});
	}
}
