/*
 * Cross Browser Drag Class
 *
 * $Id: drag.js,v 1.7 2000/11/06 12:46:43 hirose31 Exp $
 *
 */

/**
 * CBDrag Class
 */
function CBDrag() {
}
CBDrag.activeObject = null;
CBDrag.dragTargets = new Array();
CBDrag.offsetX = 0;
CBDrag.offsetY = 0;
CBDrag.activeZIndex  = 0;

CBDrag.prototype.startDrag = function() {
	if (ua.isNS) {
		document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
	}
	document.onmousedown = this.dragMouseDown;
	document.onmousemove = this.dragMouseMove;
	document.onmouseup   = this.dragMouseUp;
}
CBDrag.prototype.endDrag = function() {
	return true;
	// fixme remove event
}

CBDrag.prototype.add = function() {
	var j = CBDrag.dragTargets.length
	for (var i = 0; i < arguments.length; i++) {
		CBDrag.dragTargets[i+j] = arguments[i];
		CBDrag.dragTargets[i+j].dragGrab = new Array(0, 0, CBDrag.dragTargets[i+j].getWidth(), CBDrag.dragTargets[i+j].getHeight());

		var z = CBDrag.dragTargets[i+j].getZIndex();
		if (z >= CBDrag.activeZIndex) {
			CBDrag.activeZIndex = z + 1;
		}
	}
}
CBDrag.prototype.remove = function() {
	for (var i = 0; i < arguments.length; i++) {
		for (var j = 0; j < CBDrag.dragTargets.length; j++) {
			if (CBDrag.dragTargets[j] == arguments[i]) {
				for (var k = j; k < CBDrag.dragTargets.length - 1; k++) {
					CBDrag.dragTargets[k] = CBDrag.dragTargets[k+1];
				}
				CBDrag.dragTargets[CBDrag.dragTargets.length - 1] = null;
				CBDrag.dragTargets.length -= 1;
				break;
			}
		}
	}
}

CBDrag.prototype.setActiveZIndex = function(z) {
	CBDrag.activeZIndex = z;
}
CBDrag.prototype.getActiveZIndex = function() {
	return CBDrag.activeZIndex;
}

CBDrag.prototype.setGrab = function(cblyr, l,t,r,b) {
	cblyr.dragGrab = new Array(l,t,r,b);
}
CBDrag.prototype.getGrab = function(cblyr) { // for debug use
	return '(' + cblyr.dragGrab.join(',') + ')';
}

CBDrag.prototype.dragMouseDown = function(e) {
	var px = CBDrag.getPointerX(e);
	var py = CBDrag.getPointerY(e);
	var i;
	var retval = false;

	//window.status = 'DOWN' + px +','+ py;

	for (i = CBDrag.dragTargets.length - 1; i >= 0; i--) {
		if (CBDrag.dragTargets[i].getVisible() &&
			CBDrag.dragTargets[i].checkWithinLayer(px, py)) {
			CBDrag.activeObject = CBDrag.dragTargets[i];

			var mask = CBDrag.activeObject.dragMask;
			for (var j = 0; j < mask.length; j++) {
				if (CBDrag.activeObject.checkWithinMask(px, py, mask[j][0], mask[j][1], mask[j][2], mask[j][3])) {
					//window.status = j+': in mask';
					retval = true;
				}
			}

			CBDrag.offsetX = px - CBDrag.activeObject.getX();
			CBDrag.offsetY = py - CBDrag.activeObject.getY();
			CBDrag.activeObject.setZIndex(CBDrag.activeZIndex++);
			break;
		}
	}
	if (CBDrag.activeObject != null) {
		for (var j = i; j <= CBDrag.dragTargets.length - 2; j++) {
			CBDrag.dragTargets[j] = CBDrag.dragTargets[j+1];
		}
		CBDrag.dragTargets[CBDrag.dragTargets.length-1] = CBDrag.activeObject;
	}

	return CBDrag.activeObject != null ? retval : true;
}

CBDrag.prototype.dragMouseMove = function(e) {
	var px = CBDrag.getPointerX(e);
	var py = CBDrag.getPointerY(e);

	//window.status = 'MOVE' + px +','+ py;

	if (CBDrag.activeObject == null) {
		return true;
	} else {
		CBDrag.activeObject.moveTo(px - CBDrag.offsetX, py - CBDrag.offsetY);
		return false;
	}
}

CBDrag.prototype.dragMouseUp = function(e) {
	var px = CBDrag.getPointerX(e);
	var py = CBDrag.getPointerY(e);

	//window.status = 'UP' + px +','+ py;

	if (CBDrag.activeObject == null) {
		return true;
	} else {
		CBDrag.activeObject = null;
		return true;
	}
}

CBDrag.getPointerX = function(e) {
	return ua.isNS ? e.pageX : window.event.x + document.body.scrollLeft;
}
CBDrag.getPointerY = function(e) {
	return ua.isNS ? e.pageY : window.event.y + document.body.scrollTop;
}

// extend CBLayer
CBLayer.prototype.dragGrab = new Array();
CBLayer.prototype.dragMask = new Array();
CBLayer.prototype.checkWithinLayer = function(x, y) {
	return this.checkWithinBox(x, y,
							   this.getX()+this.dragGrab[0],
							   this.getY()+this.dragGrab[1],
							   this.getX()+this.dragGrab[2],
							   this.getY()+this.dragGrab[3]
		);
}
CBLayer.prototype.checkWithinBox = function(x, y, l, t, r, b) {
	if (x >= l && x <= r && y >= t && y <= b) {
		return true;
	} else {
		return false;
	}
}
CBLayer.prototype.checkWithinMask = function(x, y, l, t, r, b) {
	return this.checkWithinBox(x, y,
							   this.getX() + l,
							   this.getY() + t,
							   this.getX() + r,
							   this.getY() + b
		);
}

