var __debug = null;

var dragHandler = {
	dragObject:		null,
	mouseOffset:	null,
	startOffset:	null,
	mx:				0,
	my:				0,
	x:				0,
	y:				0,
	xo:				0,
	yo:				0,
	moved:			false,
	startDistance:	5,
	targetId:		'suitcase',
	locked:			false,
	blocked:		false,
	callback:		null,
	attr:			null,
	enableDrag:		false,
	
	lock: function() {
		dragHandler.locked = true;
	},
	unlock: function() {
		dragHandler.locked = false;
		if(dragHandler.dragObject) {
			dragHandler.dragObject.style.display='';
		}
	},
	process: function(force) {
		var tpos = dragHandler.getPosition($(dragHandler.targetId));
		var spos = dragHandler.getPosition(dragHandler.dragObject);
		
		var ds = Math.sqrt(Math.pow(tpos.x-spos.x,2)+Math.pow(tpos.x-spos.y,2));
		var dc = Math.sqrt(Math.pow(tpos.x-(spos.x+dragHandler.xo),2)+Math.pow(tpos.x-(spos.y+dragHandler.yo),2));
		
		if(Math.abs(dc-ds) > 25 || force ) {
			var callback = this.callback[dragHandler.dragObject.id];
			if(!callback) callback='dragHandler.unlock()';
			gravityHandler.from(dragHandler.container,dragHandler.mx,dragHandler.my);
			gravityHandler.to($(dragHandler.targetId));
			gravityHandler.step = 10;
			document.body.style.cursor='progress';
			gravityHandler.fly();
			dragHandler.lock();
			setTimeout(callback+";document.body.style.cursor='default';" ,1);
		}
		else {
			gravityHandler.from(dragHandler.container,dragHandler.mx,dragHandler.my);
			gravityHandler.to(dragHandler.dragObject);
			gravityHandler.step = 2;
			gravityHandler.fly();
			document.body.style.cursor='default';
			if(dragHandler.dragObject) {
				dragHandler.dragObject.style.display='';
			}
		}
	},
	moveTarget: function() {
		dragHandler.container.style.top = dragHandler.my+'px';
		dragHandler.container.style.left = dragHandler.mx+'px';
	},
	getContainer: function() {
		if(dragHandler.container==null) {
			dragHandler.container = $('__draganddrop_container');
			if(!dragHandler.container) {
				dragHandler.container = document.createElement( 'div' );
				dragHandler.container.setAttribute( 'id', '__draganddrop_container' );
				dragHandler.container.setAttribute( 'class', dragHandler.dragObject.className );
				dragHandler.container.style.position = 'absolute';
				if(document.all) {
					dragHandler.container.className = dragHandler.dragObject.className;
				}
				dragHandler.container.id = '__draganddrop_container';
				dragHandler.dragObject.parentNode.appendChild(dragHandler.container);				
			}			
		}
	},
	add: function(item,callback,attr) {		
		if(!item) return; 
		if(callback) {
			if(!this.callback) {
				this.callback = new Object;
			}
			this.callback[item.id] = callback;
		}
		if(attr) {
			if(!this.attr) {
				this.attr = new Object;
			}
			this.attr[item.id] = attr;
		}
		item.onmouseover = function(ev) {			
			dragHandler.enableDrag = false;
			if(!dragHandler.blocked) {
				ev           = ev || window.event;
				positiontip(ev);
	
				var tooltip = 'Drag & Drop';
				if(this.attributes.getNamedItem('dragtooltip')) {
					tooltip = this.attributes.getNamedItem('dragtooltip').value;
				}
				var delay = 500;
				if(this.attributes.getNamedItem('dragdelay')) {
					delay = this.attributes.getNamedItem('dragdelay').value;
				}
	
				var item = this;
				this.finch = setTimeout( function() { ddrivetip(tooltip); document.body.style.cursor='pointer';document.body.style.cursor='hand';dragHandler.enableDrag=true; } , 1000 );
				
				var attr = dragHandler.getAttr();;
				if(attr) {
					if(attr.move) {
						dragHandler.targetId = this.id;
					}
				}
			}
		}
		item.onmouseout = function(ev) {			
			if(this.finch) {
				clearTimeout(this.finch);
				dragHandler.enableDrag = false;
			}
			hideddrivetip();
			document.body.style.cursor='default';
		}
		item.onmousedown = function(ev){ 
			ev           = ev || window.event;
			if(dragHandler.enableDrag) {
				dragHandler.dragObject  = this; 
				dragHandler.startOffset = dragHandler.mouseCoords(ev); 
				dragHandler.mouseOffset = dragHandler.getMouseOffset(dragHandler.dragObject,ev); 
				dragHandler.moved		= false;
			}
			return false; 
		} 
	},
	addSimple: function(item,callback,attr) {		
		if(!item) return; 
		if(callback) {
			if(!this.callback) {
				this.callback = new Object;
			}
			this.callback[item.id] = callback;
		}
		if(attr) {
			if(!this.attr) {
				this.attr = new Object;
			}
			this.attr[item.id] = attr;
		}
	},
	down: function(ev) {
		ev           = ev || window.event;
		if(!dragHandler.locked) {
			if(dragHandler.dragObject) {
				dragHandler.getContainer();
				var dt = Math.sqrt(Math.pow(dragHandler.yo,2)+Math.pow(dragHandler.xo,2));
				if(dt>dragHandler.startDistance) {
					hideddrivetip();
					dragHandler.process();
				}
				else {
					dragHandler.container.style.display='none';
				}		
			}
			dragHandler.dragObject = null;
			dragHandler.yo = 0;
			dragHandler.xo = 0;
		}
	},
	force: function(item,ev) {
		if(!dragHandler.locked) {
			dragHandler.dragObject = item;
			dragHandler.getContainer();
			ev           = ev || window.event;
			dragHandler.startOffset = dragHandler.mouseCoords(ev); 
			dragHandler.mouseOffset = dragHandler.getMouseOffset(dragHandler.dragObject,ev); 
			var mousePos = dragHandler.mouseCoords(ev);

			dragHandler.my	= mousePos.y - dragHandler.mouseOffset.y;
			dragHandler.mx	= mousePos.x - dragHandler.mouseOffset.x;
			dragHandler.yo	= mousePos.y - dragHandler.startOffset.y;
			dragHandler.xo	= mousePos.x - dragHandler.startOffset.x;
			dragHandler.y	= mousePos.y;
			dragHandler.x	= mousePos.x;

			dragHandler.moved = true;
			dragHandler.container.innerHTML = dragHandler.dragObject.innerHTML;
			dragHandler.container.style.display='';

			dragHandler.process(true);
		}
	},
	getAttr: function() {
		var attr;
		if(dragHandler.attr && dragHandler.dragObject) {
			attr = dragHandler.attr[dragHandler.dragObject.id];
			if(!attr) {
				attr = new Object;
			}
		}
		return attr;
	},
	move: function(ev) {
		if(!dragHandler.locked) {
			ev           = ev || window.event;
			positiontip(ev);
			if(dragHandler.dragObject) {
				var mousePos = dragHandler.mouseCoords(ev);
	
				dragHandler.my	= mousePos.y - dragHandler.mouseOffset.y;
				dragHandler.mx	= mousePos.x - dragHandler.mouseOffset.x;
				dragHandler.yo	= mousePos.y - dragHandler.startOffset.y;
				dragHandler.xo	= mousePos.x - dragHandler.startOffset.x;
				dragHandler.y	= mousePos.y;
				dragHandler.x	= mousePos.x;

				if(!dragHandler.moved) {
					var dt = Math.sqrt(Math.pow(dragHandler.yo,2)+Math.pow(dragHandler.xo,2));
					if(dt>dragHandler.startDistance) {
						dragHandler.moved = true;
						dragHandler.getContainer();
						dragHandler.container.innerHTML = dragHandler.dragObject.innerHTML;
						dragHandler.container.style.display='';
						
						
						var attr = dragHandler.getAttr();;
						if(attr) {
							if(attr.move) {
								dragHandler.dragObject.style.display='none';
							}
						}
					}
				}


				if(dragHandler.moved) {
					dragHandler.moveTarget();
				} 
				
				return false;
			}
		}
	},
	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};
	},
	getPosition: function(element) {
    	return getAbsolutePosition(element);
    },
	mouseCoords: function(ev) {
		if (!ev) var ev = window.event;
		if(ev.pageX || ev.pageY) {
			return {x:ev.pageX, y:ev.pageY};
		}
		var o = {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		}
		return o;
	}
};

document.onmousemove = dragHandler.move;
document.onmouseup = dragHandler.down;



