self.DOOM={
	getPageX:function(elem){
		return elem.offsetParent ? elem.offsetLeft+self.DOOM.getPageX(elem.offsetParent):elem.offsetLeft;
	},
	getParentX:function(elem){
		return elem.offsetLeft;
	},
	getPageY:function(elem){
		return elem.offsetParent ? elem.offsetTop+self.DOOM.getPageY(elem.offsetParent):elem.offsetTop;
	},
	getParentY:function(elem){
		return elem.offsetTop;
	},
	getRelativeHeight:function(elem){
		var old = self.DOOM.resetCSS(elem, {
			height:'',
			display:'',
			visibility:'hidden'
		});
		if(self.DOOM.getStyle(elem, 'display')!='none'){
			var h = elem.offsetHeight+'px' || self.DOOM.getStyle(elem, 'height');
			self.DOOM.restoreCSS(elem, old);
			return h;
		}
		
		var h = elem.clientHeight+'px' || self.DOOM.getStyle(elem, 'height');
		restoreCSS(elem, old);
		return h;
	},
	getHeight:function(elem){
		var h = elem.offsetHeight+'px' || elem.clientHeight+'px' || self.DOOM.getStyle(elem, 'height');
		return h;
	},
	getWidth:function(elem){
		var h = elem.offsetWidth+'px' || elem.clientWidth+'px' || self.DOOM.getStyle(elem, 'width');
		return h;
	},
	getFullHeight:function(elem){
		var old = self.DOOM.resetCSS(elem, {
			height:'',
			width:'',
			display:'block',
			visibility:'visible',
			position:'absolute'
		});
		$(elem).setStyle('width', self.DOOM.getWidth(elem));
		var h = self.DOOM.getHeight(elem);
		self.DOOM.restoreCSS(elem, old);
		return h;
	},
	getRelativeWidth:function(elem){
		if(self.DOOM.getStyle(elem, 'display')!='none')
			return elem.offsetWidth+'px' || self.DOOM.getStyle(elem, 'width');
		var old = DOOM.resetCSS(elem, {
			display:'',
			visibility:'hidden'
		});
		var h = elem.clientWidth+'px' || self.DOOM.getStyle(elem, 'width');
		self.DOOM.restoreCSS(elem, old);
		return h;
	},
	getFullWidth:function(elem){
		var old = self.DOOM.resetCSS(elem, {
			visibility:'hidden',
			display:'block'
		});
		var w = self.DOOM.getWidth(elem);
		self.DOOM.restoreCSS(elem, old);
		return w;
	},
	fixE:function(e){
		e = e || window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	},
	getTarget:function(e){
		e = this.fixE(e);
		return e.target||e.srcElement;
	},
	getName:function(e){
		
		if (this.getTarget(e) != undefined) {
			//console.log(this.getTarget(e)==undefined);
			var name = this.getTarget(e).nodeName.toLowerCase();
			return name;
		}
		else 
			return e.nodeName.toLowerCase();
	},
	stopBubble:function(e){
		e = self.DOOM.fixE(e);
		if(e&&e.stopPropagation)
			e.stopPropagation();
		else
			window.event.cancelBubble = true;
			
	},
	getKey:function(e){
		e = self.DOOM.fixE(e);
		return e.keyCode;
	},
	stopDefault:function(e){
		e = self.DOOM.fixE(e);
		(e.stopPropagation) ? e.stopPropagation() : e.cancelBubble = true;
		(e.preventDefault) ? e.preventDefault() : e.returnValue = false;
		return false;
	},
	getStyle:function(elem, prop){
		return elem.style[prop];
	},
	getComStyle:function(elem, prop){
		if(window.getComputedStyle)
  			s= window.getComputedStyle(elem, null).getPropertyValue(prop);
 
		else if(elem.currentStyle)
   			s=elem.currentStyle.backgroundColor;
 
		else if(document.ids)
   			s=elem.bgColor;
 
		else if(document.all)
    		s=elem.style.backgroundColor;
		return s;
	},
	getElementByClassName:function(elem, str){
		if(typeof elem.childNodes !='undefined')
		for(var i=0;i<elem.childNodes.length;i++){
			if(elem.childNodes[i].className==str)
				return elem.childNodes[i];
			if (elem.childNodes[i].hasChildNodes()) {
				var res = DOOM.getElementByClassName(elem.childNodes[i], str);
				if(res)
					return res;
			}
		}
		return false;
	},
	searchObj:function(pObj, obj){
		for(var i = 0; i < pObj.length; i++) {
				
			if (pObj[i] == obj) 
					return {'arr':pObj,'nr':i};
			if (typeof pObj[i].child != 'undefined') {
				var res = DOOM.searchObj(pObj[i].child, obj);
				if (res) 
					return res;
			}
		}	
				
		return false;
	},
	searchObjId:function(pObj, obj){
		for(var i = 0; i < pObj.length; i++) {
			if (pObj[i].id == obj) 
					return {'arr':pObj,'nr':i};
			if (typeof pObj[i].child != 'undefined') {
				var res = DOOM.searchObjId(pObj[i].child, obj);
				if (res) 
					return res;
			}
		}	
				
		return false;
	},
	resetCSS:function(elem, prop){
		var old = {};
		for(var i in prop){
			old[i] = self.DOOM.getStyle(elem, i) || self.DOOM.getComStyle(elem, i) || prop[i];
			elem.style[i]=prop[i];
		}
		return old;
	},
	saveCSS:function(elem, prop){
		var old = {};
		for(var i in prop){
			old[i] = self.DOOM.getStyle(elem, i) || prop[i] || self.DOOM.getComStyle(elem, i);
		}
		return old;
	},
	restoreCSS:function(elem, prop){
		for(var i in prop){
			elem.style[i]=prop[i];
		}
	},
	userText:function(stri, tags){
		
		stri = self.DOOM.stripTags(stri, tags);
		var tagStr = '<'+tags.join('><')+'>';
		var tag_clear_array = {'img':{'s':'<img[^>]*src="([^"]*)"[^>]*>', 'e':'<img src="$1">'}, 'a':{'s':'<a[^>]*href="([^"]*)"[^>]*>', 'e':'<a href="$1" target="_blank">'}};
		for(var i=0; i<tags.length;i++){
			if(typeof tag_clear_array[tags[i]]!='undefined'){
				var regex = new RegExp(tag_clear_array[tags[i]]['s'], "gi");
				var suchmuster = regex;
				var ersatz = tag_clear_array[tags[i]]['e'];
			}else{
				var regex = new RegExp("<"+tags[i]+"([^>]*)>", "gi");
				var suchmuster = regex;
				var ersatz = '<'+tags[i]+'$1>';
					
			}
			stri = stri.replace(suchmuster, ersatz);
		}
		return stri;
	},
	stripTags:function(str, tags){
		var matches = str.match(/(<\/?[\S][^>]*>)/gi);
		if(matches!=null)
			for (var i=0;i<matches.length;i++) {
				var allowed = false;
				var match = matches[i];
				var tag = match.replace(/<\/?([^>\s]*)\s*[^>]*>/, '$1');
				for (var j=0;j<tags.length;j++) {
					if(tags[j]==tag){
						allowed = true;
						break;
					}
				}
				if(!allowed){
					var reGex = new RegExp("<[/]*"+tag+"\s*[^>]*>", "gi");
					str = str.replace(reGex, '');
				}
			}
		return str;
	},
	timestamp:function(){
		return new Date().getTime();
	},
	indexSort:function (a, b) {
  		return a.pos - b.pos;
	},
	sortArr:function(arr, index){
		var t = [];
		for (var i=0; i<arr.length; i++) {
			arr[i].pos = i;
			t.push(arr[i].id);
		};
		return t;
	},
	run:function(pObj, fn){
		for(var i = 0; i < pObj.length; i++) {
			fn(pObj[i]);
			
			if (typeof pObj[i].child != 'undefined') {
				DOOM.run(pObj[i].child, fn);
				
			}
		}
		return false;
	},
	runRet:function(pObj, fn, tag){
		var ret = $(tag).get();
		for(var i = 0; i < pObj.length; i++) {
			$(ret).append(fn(pObj[i]));
			
			if (typeof pObj[i].child != 'undefined') {
				$(ret).append(DOOM.runRet(pObj[i].child, fn, tag));
			}
			
		}
		return ret;
	},
	over:function(pObj, x,y){
		var retObj = false;
		test = pObj;
		pObj = test.child;
		if(typeof pObj[0]=='undefined'){
			retObj = {
					'obj': pObj,
					'dir': 'append',
					'w':'1'
			};
		}else{
			for(var i = 0; i < pObj.length; i++) {
				if (pObj[i].pos == 0) {
					if (y<pObj[i].y) {
						retObj = {
							'obj': test,
							'dir': 'pbefore',
							'w': '2'
						};
					}else{
						retObj = {
							'obj': test,
							'dir': 'pafter',
							'w': '3'
						};
					}
				}	
			}
		}
		for(var i = 0; i < pObj.length; i++) {
			
			if(pObj[i].id=='33')
				continue;
				
			if(y>pObj[i].y){
				if(retObj.obj.pos<pObj[i].pos){
					if (x<pObj[i].x) {
						retObj = {
							'obj': pObj[i],
							'dir': 'before',
							'w': '4'
						};
					}else{
						retObj = {
							'obj': pObj[i],
							'dir': 'after',
							'w': '5'
						};
					}
				}
				if (x>pObj[i].x && x < (pObj[i].x + parseInt(pObj[i].w)) && y < (pObj[i].y + parseInt(pObj[i].h))) {
					
					if (x < pObj[i].x + pObj[i].w/2) {
						retObj = {
							'obj': pObj[i],
							'dir': 'before',
							'w':'6'
						};
					}else if (x > pObj[i].x + pObj[i].w/2) {
						retObj = {
							'obj': pObj[i],
							'dir': 'after',
							'w':'7'
						};
					}
					if (typeof pObj[i].child != 'undefined' && typeof pObj[i].child[0] != 'undefined') {
						if(x > pObj[i].x+10 && y>pObj[i].y+19 && x < (pObj[i].x + parseInt(pObj[i].w)-20) && y< (pObj[i].y + parseInt(pObj[i].h)-25)){
							dir = 'center';
							retObj = {
								'obj': pObj[i],
								'dir': 'center',
								'w':'8'
							};
						}
						if(dir == 'center'){
							retObj = DOOM.over(pObj[i], x, y);
						}
					}
					break;
				}
			}
		}
		return retObj;
	},
	posChildNr:function(obj, x, y, walkObj){
		var nr = {'nr':100,'pos':'after'};
		var dir = 'h';
		var nextGrößer = 0;
		if (typeof obj.child != 'undefined' && obj.child.length && obj.type!='COMMENT') {
			var nr = {'nr':obj.child.length,'pos':'before'};
			for (var i=0; i < obj.child.length; i++) {
				if (x < obj.child[i].x+obj.child[i].w/2 || y<obj.child[i].y+obj.child[i].h/2) {
					nr =  {'nr':Math.min(i, nr.nr),'pos':'before'};
				}/*else{
					nr = {'nr':Math.min(i, nr),'pos':'after'};
				}*/
				/*if (x >obj.child[i].x && x < obj.child[i].x+obj.child[i].w && y>obj.child[i].y &&  y<obj.child[i].y+obj.child[i].h) {
					if (x < obj.child[i].x + obj.child[i].w/2 &&  y < obj.child[i].y + obj.child[i].h/2) {
						obj.child[i].root.style.background = '#f0f';
						nr =  {'nr':Math.min(i, nr.nr),'pos':'before'};
					}
				}else{
					obj.child[i].root.style.background='#ff0';
				}*/
				//if(obj.child[i].type!='TEMP')
					/*if(x+walkObj.w/2>obj.child[i].x && x+walkObj.w/2<obj.child[i].x+obj.child[i].w){
						if(y+walkObj.h/2>obj.child[i].y && y+walkObj.h/2<obj.child[i].y+obj.child[i].h){
							console.log(walkObj.w);
							if(x+walkObj.w/2>obj.child[i].x+obj.child[i].w/2)
								nr = Math.min(i+1, nr);
							else
								nr = Math.min(i, nr);
						}
					}else if(i==0 && y+walkObj.h/2<obj.child[i].y){
						nr=0;
					}else if(i==obj.child.length-1 && (y+walkObj.h/2>obj.child[i].y || x+walkObj.w/2<obj.child[i].x+obj.child[i].w)){
						nr=obj.child.length;
					}*/
				/*else
					return 100;*/
				
				/*if (i == obj.child.length - 1 && x > obj.child[i].x + obj.child[i].w / 2) {
					console.log(obj);
					return obj.child.length - 1;
				}*/
				/*if(x>obj[i].child[i].x && x<(obj[i].child[i].x+parseInt(obj[i].child[i].w)) && y>obj[i].child[i].y && y<(obj[i].child[i].y+parseInt(obj[i].child[i].h))){
					
				}*/
			}
		}else{
			return {'nr':0,'pos':'after'};
		}
		return nr;
	},
	getStaticSize:function(obj){
		if (typeof obj.root !='undefined') {
			obj.h = parseInt(DOOM.getHeight(obj.root));
			obj.w = parseInt(DOOM.getWidth(obj.root));
			obj.x = DOOM.getPageX(obj.root);
			obj.y = DOOM.getPageY(obj.root);
		}
	},
	addPos:function(arr, pos){
		for (var i=0; i<arr.length; i++) 
			if (arr[i].pos >= pos) 
				arr[i].pos ++;
	},
	subPos:function(arr, pos){
		for (var i=0; i<arr.length; i++) 
			if (arr[i].pos >= pos) 
				arr[i].pos --;
	}
}
var counter = 0;
/*Array.prototype.add = function(pos, elem){
	var start = this.slice(0,pos);
	var end = this.slice(pos);
	start.push(elem);
	var ges = start.concat(end);
	this.splice(0, this.length);
	for (var i=0; i<ges.length; i++) {
		this.push(ges[i]);
	};
}*/
var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper,DragStart, DragEnd, Dragging){
		o.onmousedown = Drag.start;
		
		o.hmode = bSwapHorzRef ? false : true ;
		o.vmode = bSwapVertRef ? false : true ;
		
		o.root = oRoot && oRoot != null ? oRoot : o ;
		
		if (o.hmode && isNaN(parseInt(o.root.style.left ))) o.root.style.left = "0px";
		if (o.vmode && isNaN(parseInt(o.root.style.top ))) o.root.style.top = "0px";
		if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right = "0px";
		if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = "0px";
		
		o.minX = typeof minX != 'undefined' ? minX : null;
		o.minY = typeof minY != 'undefined' ? minY : null;
		o.maxX = typeof maxX != 'undefined' ? maxX : null;
		o.maxY = typeof maxY != 'undefined' ? maxY : null;
		
		o.xMapper = fXMapper ? fXMapper : null;
		o.yMapper = fYMapper ? fYMapper : null;
		
		o.root.onDragStart = DragStart;
		o.root.onDragEnd = DragEnd;
		o.root.onDrag = Dragging;
	},

	start : function(e){
		
		var o = Drag.obj = this;

		e = Drag.fixE(e);
		var y = parseInt(o.vmode ? o.root.style.top : o.root.style.bottom);
		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
		o.root.onDragStart(x, y);
		o.lastMouseX = e.clientX;
		o.lastMouseY = e.clientY;
			
		if (o.hmode) {
			if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;
			if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
		} else {
			if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
			if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
		}
			
		if (o.vmode) {
			if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;
			if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
		} else {
			if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
			if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
		}
	
		document.onmousemove = Drag.drag;
		document.onmouseup = Drag.end;
	
		return false;
	},

drag : function(e){
	e = Drag.fixE(e);
	var o = Drag.obj;
	
	var ey = e.clientY;
	var ex = e.clientX;
	var y = parseInt(o.vmode ? o.root.style.top : o.root.style.bottom);
	var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
	var nx, ny;
	
	if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
	if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
	if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
	if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);
	
	nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
	ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));
	
	if (o.xMapper) nx = o.xMapper(y)
	else if (o.yMapper) ny = o.yMapper(x)
	
	Drag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
	Drag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
	Drag.obj.lastMouseX = ex;
	Drag.obj.lastMouseY = ey;
	
	Drag.obj.root.onDrag(ex, ey);
	return false;
},

end : function(e){
	document.onmousemove = null;
	document.onmouseup = null;
	if(typeof Drag.obj.root.onDragEnd == "function")
		Drag.obj.root.onDragEnd( parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]), parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
	//Drag.obj.root.onDragEnd(e);
	//Drag.obj.root.onDragEnd( parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]), parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
	Drag.obj = null;
},

fixE : function(e){
	if (typeof e == 'undefined') e = window.event;
	if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
	if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
	return e;
	}
};

