/**
* Allows dragging and dropping of html elements.
* Usage: onmousedown = function() { dragPress(event, id); }
*/

var drg_box;
var deltaX, deltaY;

function windowLoaded(evt) {
	// prevent IE text selection while dragging!!! Little-known trick!
	document.body.ondrag = function () { return false; };
	document.body.onselectstart = function () { return false; };
}

function setOpacity(node,val) {
	if (node.filters) {
      try { node.filters["alpha"].opacity = val*100; } catch (e) {
        try {
            node.style.filter = 'alpha(opacity='+val*100+')';
            node.style.opacity = val;
        } catch(e) { }
      }
	} else if (node.style.opacity) {
		node.style.opacity = ''+val+'';
	} else {
      try {
        node.style.filter = 'alpha(opacity='+val*100+')';
        node.style.opacity = val;
      } catch (e) { alert('error filtering:'+e) }
    }

}

function getX(node) {
	return parseInt(node.style.left);
}

function getY(node) {
	return parseInt(node.style.top);
}

function getWidth(node) {
	return parseInt(node.style.width);
}

function getHeight(node) {
	return parseInt(node.style.height);
}

function setX(node,x) {
	node.style.left = x + "px";
}

function setY(node,y) {
	node.style.top = y + "px";
}

function Evt(evt) {
	this.evt = evt ? evt : window.event;
	this.source = evt.target ? evt.target : evt.srcElement;
	this.x = evt.pageX ? evt.pageX : evt.clientX;
	this.y = evt.pageY ? evt.pageY : evt.clientY;
}

Evt.prototype.toString = function () {
	return "Evt [ x = " + this.x + ", y = " + this.y + " ]";
};

Evt.prototype.consume = function () {
	if (this.evt.stopPropagation) {
		this.evt.stopPropagation();
		this.evt.preventDefault();
	} else if (this.evt.cancelBubble) {
		this.evt.cancelBubble = true;
		this.evt.returnValue  = false;
	}
};

Evt.addEventListener = function (target,type,func,bubbles) {
	if (document.addEventListener) {
		target.addEventListener(type,func,bubbles);
	} else if (document.attachEvent) {
		target.attachEvent("on"+type,func,bubbles);
	} else {
		target["on"+type] = func;
	}
};

Evt.removeEventListener = function (target,type,func,bubbles) {
	if (document.removeEventListener) {
		target.removeEventListener(type,func,bubbles);
	} else if (document.detachEvent) {
		target.detachEvent("on"+type,func,bubbles);
	} else {
		target["on"+type] = null;
	}
};

function dragPress(evt, id, opacity) {
    windowLoaded(evt);
	evt = new Evt(evt);
    if (!id) {
        drg_box = evt.source;
    } else {
    	drg_box = document.getElementById(id);
        drg_box.style.position = 'absolute';
    }
	if (opacity) setOpacity(drg_box, opacity);
	drg_box.z_ndex = (drg_box.zIndex) ? drg_box.zIndex : 100;
	drg_box.zIndex = 10000; // bring drg_box to the front
	deltaX = evt.x - getX(drg_box);
	deltaY = evt.y - getY(drg_box);
	Evt.addEventListener(document,"mousemove",dragMove,false);
	Evt.addEventListener(document,"mouseup",dragRelease,false);
	// lessen work in dragMove
	window.Scroll = new common.winScroll(); 
	drg_box.Dim = new common.objDim(drg_box);
}

function dragMove(evt) {
	evt = new Evt(evt);
	var x = evt.x - deltaX;
	var y = evt.y - deltaY;
	drg_box.Dim = drg_box.Dim ? drg_box.Dim : new common.objDim(drg_box);
	window.Dim = window.Dim ? window.Dim : new common.winDim();
	window.Scroll = window.Scroll ? window.Scroll : new common.winScroll();
	if (window.Dim.w + window.Scroll.x < x + drg_box.Dim.w) { 
		x = window.Dim.w + window.Scroll.x - drg_box.Dim.w;
	} else if ( x < 0) {
		 x = 0;
	}
	if (window.Dim.h + window.Scroll.y < y + drg_box.Dim.h ) {
		y = window.Dim.h + window.Scroll.y - drg_box.Dim.h;
	} else if (y < 0) {
		y = 0;
	} 
	setY(drg_box, y);
	setX(drg_box, x);	
	evt.consume();
}

function dragRelease(evt) {
	evt = new Evt(evt);
	setOpacity(drg_box, 100);
	drg_box.zIndex = (drg_box.z_index) ? drg_box.z_index : 100;
	Evt.removeEventListener(document,"mousemove",dragMove,false);
	Evt.removeEventListener(document,"mouseup",dragRelease,false);
	if (dropCheck()) {
    dropTask(); // check tasks
    }
}

/**
* Do some check
*/
function dropCheck() {
    return false;
}

/**
* Task to run if dropCheck returned true
*/
function dropTask() {
    return false;
}
