
	var dd = function(){
		var _geometry = function(){
			/* GLOBAL PRIVATE STUFF */
	
			/* PUBLIC STUFF */
			return {
				point: function(iX, iY){
					return {
						x: iX,
						y: iY,
						toString: function() {
							return this.x + ', ' + this.y;
						},
						removeOffset: function(oPoint){
							this.x -= oPoint.x;
							this.y -= oPoint.y;
						}
					};
				},
				rectangle: function(iWidth, iHeight){
					return {
						width: iWidth,
						height: iHeight,
						toString: function() {
							return this.width + 'x' + this.height;
						}
					};
				},
				area: function(pPosition, rRectangle){
					return {
						position: pPosition,
						dimensions: rRectangle,
						bottomRightPoint: function() {
							return dd.geometry.point(this.position.x+this.dimensions.width, this.position.y+this.dimensions.height);
						},
						toString: function() {
							return this.position.toString() + ' Dimensions: ' + this.dimensions.toString();
						},
						isPointWithin: function(oPoint){
							if((oPoint.x > this.position.x && oPoint.x < (this.position.x + this.dimensions.width)) && (oPoint.y > this.position.y && oPoint.y < this.position.y + this.dimensions.height)){
								return true;
							}
							return false;
						},
						overlapsWith: function(oArea){
							var margin = 2;
							var left1 = oArea.position.x - margin;
							var left2 = this.position.x - margin;
							var right1 = oArea.position.x + oArea.dimensions.width + margin;
							var right2 = this.position.x + this.dimensions.width + margin;
							var top1 = oArea.position.y - margin;
							var top2 = this.position.y - margin;
							var bottom1 = oArea.position.y + oArea.dimensions.height + margin;
							var bottom2 = this.position.y + this.dimensions.height + margin;
							
							if (bottom1 < top2) return false;
							if (top1 > bottom2) return false;
						
							if (right1 < left2) return false;
							if (left1 > right2) return false;
							
							return true;
						}
					};
				}
			};
		}();
		
		var _UI = function(){
			return {
				getElementArea: function(oElement){
					var oPosition = dd.geometry.point(0,0);
					var oDimensions = dd.geometry.rectangle(0,0);
					
					var oElementClone = oElement; 
					var pos = 0;
					if (oElementClone.offsetParent){
						while (oElementClone.offsetParent){
							pos += oElementClone.offsetLeft;
							oElementClone = oElementClone.offsetParent;
						}
					}
					else if(oElementClone.x){
						pos += oElementClone.x;
					}
					oPosition.x = pos;
					
					oElementClone = oElement
					pos = 0;
					if (oElementClone.offsetParent){
						while (oElementClone.offsetParent){
							pos += oElementClone.offsetTop;
							oElementClone = oElementClone.offsetParent;
						}
					}
					else if(oElementClone.y){
						pos += oElementClone.y;
					}
					oPosition.y = pos;
					
					oDimensions.width = oElement.scrollWidth;
					oDimensions.height = oElement.scrollHeight;
					
					return dd.geometry.area(oPosition, oDimensions);
				}
			};
		}();
		
		var _common = function(){
			return {
				getEventPoint: function(e){
					var x = 0;
					var y = 0;
					if (!e) e = window.event;    
					if (typeof e.pageY == 'number'){
						y = e.pageY;
						x = e.pageX;
					}
					else{
						y = (e.clientY) + document.documentElement.scrollTop;
						x = (e.clientX);
					}
					return dd.geometry.point(x, y);
				}
			};
		}();
		
		return {
			geometry: _geometry,
			UI: _UI,
			common: _common
		}
	}();