App.modules.dragDrop = {
	object : null,
	clone  : null,
	mouseOffset : null,
	init : function() {
		$(document).bind('mousemove', function(ev) {
			ev           = ev || window.event;
			var mousePos = App.modules.dragDrop.mouseCoords(ev);
			var mouseOffset = App.modules.dragDrop.mouseOffset;
			var object = App.modules.dragDrop.object
			var rect = App.modules.dragDrop.getDocumentRect();
			if(object){
				var x = (mousePos.x - mouseOffset.x);				
				var y = (mousePos.y - mouseOffset.y);
				
				if (x > rect.max.x - object.outerWidth()) x = rect.max.x - object.outerWidth();
				if (x < rect.min.x) x = rect.min.x;
				
				if (y > rect.max.y - object.outerHeight()) y = rect.max.y - object.outerHeight();
				if (y < rect.min.y) y = rect.min.y;
				
				object.css({
					position : 	'absolute',
					left : 		x + 'px',
					top : 		y + 'px'
				});
			}
		});
		$(document).bind('mouseup', function(e) {	
			if(App.modules.dragDrop.object) {
				if (App.modules.dragDrop.onDrop) {
					App.modules.dragDrop.onDrop();
				}					
				App.modules.dragDrop.object.css('position', '');
				App.modules.dragDrop.object = null;
			}
		});
	},
	mouseCoords : function(ev) {
		if(ev.pageX || ev.pageY) {
			return {x:ev.pageX, y:ev.pageY};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	},
	getMouseOffset : function(target, ev) {
		ev = ev || window.event;
	
		var docPos    = this.getPosition(target);
		var mousePos  = this.mouseCoords(ev);
		return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
	},
	getViewportRect : function() {
		with (document.documentElement) {
			return {min : {x : scrollLeft, y : scrollTop}, max : {x : clientWidth + scrollLeft, y : clientHeight + scrollTop}};
		}
	},
	getDocumentRect : function() {
		with (document.documentElement) {
			return {min : {x : 0, y : 0}, max : {x : offsetWidth, y : offsetHeight}};
		}
	},	
	getPosition : function(e) {
		return {x:e.offset().left, y:e.offset().top};
	},
	makeDraggable : function(item, itemBar) {
		if(!item) return;
		if(!itemBar) itemBar = item;
		this.onDrop = null;
		itemBar.bind('mousedown', {item: item}, function(e) {
			App.modules.dragDrop.object = e.data.item;
			App.modules.dragDrop.mouseOffset = App.modules.dragDrop.getMouseOffset(e.data.item, e);
			//return false;
		});
	},
	makeDraggableById : function(id) {
		$('#'+id).map(this.makeDraggable);
	},
	makeDraggableByClass : function(className) {
		$('.'+className).map(this.makeDraggable);
	}
};