var oldSelectstart;
var dragObject  = null;
var mouseOffset = null;
var textHighlight = true;
var bindings = new Array();

function bindElement(bindToElement, elementToBind, offsetX, offsetY){
	bindings[bindToElement.id] = [elementToBind, offsetX, offsetY];
}

function getMouseOffset(target, ev){
	ev = ev || window.event;
	var docPos    = getPositionXY(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function mouseCoords(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
	};
}

function getPositionXY(e){
	var left = 0;
	var top  = 0;

	while (e.offsetParent){
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}

	left += e.offsetLeft;
	top  += e.offsetTop;

	return {x:left, y:top};
}

function mouseMove(ev){
	ev           = ev || window.event;
	var mousePos = mouseCoords(ev);
	var ycheck = true;
	var xcheck = true
	var boundElement = null;

	if (typeof dragndrop_constraints!='undefined' && dragndrop_constraints!=false) {
		dragndrop_constraints();
	}


	if(dragObject){
		if (bindings[dragObject.id]){
			boundElement = bindings[dragObject.id][0];
		}
		if (textHighlight) {
			disableSelect();
		}
		dragObject.style.position = 'absolute';

		if (typeof ymin!='undefined') {
			if (ymin> (mousePos.y - mouseOffset.y)) {
				dragObject.style.top = ymin;
				ycheck = false;
			}
		}
		if (typeof ymax!='undefined') {
			if (ymax< (mousePos.y - mouseOffset.y)) {
				dragObject.style.top = ymax;
				ycheck = false;
			}
		}
		if (typeof xmin!='undefined') {
			if (xmin> (mousePos.x - mouseOffset.x)) {
				dragObject.style.top = xmin;
				xcheck = false;
			}
		}
		if (typeof xmax!='undefined') {
			if (xmax< (mousePos.x - mouseOffset.x)) {
				dragObject.style.top = xmax;
				xcheck = false;
			}
		}

		if (ycheck){
			dragObject.style.top = mousePos.y - mouseOffset.y;
			if (bindings[dragObject.id]){
				boundElement.style.top = parseInt(mousePos.y - mouseOffset.y + bindings[dragObject.id][2], 10);
			}
		}
		if (xcheck){
			dragObject.style.left = mousePos.x - mouseOffset.x;
			if (bindings[dragObject.id]){
				boundElement.style.left = parseInt(mousePos.x - mouseOffset.x + bindings[dragObject.id][1], 10);
			}
		}
	}
}
function mouseUp(){
	dragObject = null;
	enableSelect();
}

function makeDraggable(item){
	if(!item) return;
	item.onmousedown = function(ev){
		dragObject  = this;
		mouseOffset = getMouseOffset(this, ev);
		return false;
	}
}

function dragWindow(ev,element){
	dragObject  = element.parentNode;
	mouseOffset = getMouseOffset(element.parentNode, ev);

}

function disableSelect() {
	//disable select for ie
	textHighlight = false;
	if (typeof document.onselectstart != 'undefined') {
		oldSelectstart = document.onselectstart;
		document.onselectstart = function(){return false;};//disable text highlighting while we're dragging (ie only)
	}
	else {
		//disable select for ff/mozilla
		styleElement = document.createElement('style');
		text = document.createTextNode("* {-moz-user-select:none;user-select:none}");
		styleElement.appendChild(text);
		styleElement.id = 'dragndrop_css';
		document.getElementsByTagName('head')[0].appendChild(styleElement);
	}
}

function enableSelect() {
	//enable select for ie
	textHighlight = true;
	if (typeof oldSelectstart != 'undefined') {
		document.onselectstart = oldSelectstart;
	}
	else {
	//enable select for ff/mozilla

		head = document.getElementsByTagName('head')[0];
		head_node = head.lastChild;
		while (head_node.previousSibling != null && head_node.tagName!='STYLE') {
			head_node = head_node.previousSibling;

		}
		if (head_node.id=='dragndrop_css') {
			head.removeChild(head_node);
		}
	}
}
add_event_handler("document","onmousemove", "mouseMove");
add_event_handler("document","onmouseup",  "mouseUp");
