// ----- dragging -----
var gDragEl, gDragX, gDragY, gDragScrollTop, gDragScrollLeft;
var gDragMinL = 0, gDragMaxL = 0, gDragMinT = 0, gDragMaxT = 0;
var gDragFunc = null, gDragStopFunc = null;

function Drag(e){
	e = e ? e : event;
	var l = temp1 + e.clientX - gDragX + (document.body.scrollLeft - gDragScrollLeft);
	var l2 = l < gDragMaxL ? l > gDragMinL ? l : gDragMinL : gDragMaxL;
	var t = temp2 + e.clientY - gDragY + (document.body.scrollTop - gDragScrollTop);
	var t2 = t < gDragMaxT ? t > gDragMinT ? t : gDragMinT : gDragMaxT;	
	if(gDragEl){
		gDragEl.style.left = l2 + "px";
		gDragEl.style.top = t2 + "px";
	}	
	if(gDragFunc){
		gDragFunc(l2, t2);
	}
	
	// if off the browser window, stop dragging (we can't intercept onmouseup if it occurs there)
	var oPage = new ncPage();
	var cx = e.clientX;
	var cy = e.clientY;
	var tol = 3;
	if(cx < oPage.sl + tol || cx > oPage.sl + oPage.cw - tol || cy < oPage.st + tol || cy > oPage.st + oPage.ch - tol){
		DragStop();
	}
	
	return false;
}
function DragStart(e, el, MoveFunc, StopFunc, emptyLeft, emptyTop, dragContainer, p_bManualDragStop){
	var oEvent = e ? e : event;
	if(dragContainer){
		var dc = dragContainer;
		var ih, iw;
		ih = dc.offsetHeight - (parseInt(ncBwHlpr.GetStyle(dc, "border-top-width"), 10) + parseInt(ncBwHlpr.GetStyle(dc, "border-bottom-width"), 10));
		iw = dc.offsetWidth - (parseInt(ncBwHlpr.GetStyle(dc, "border-left-width"), 10) + parseInt(ncBwHlpr.GetStyle(dc, "border-right-width"), 10));
		gDragMinL = 0 + dc.scrollLeft;
		gDragMinT = 0 + dc.scrollTop;
		gDragMaxL = iw - el.offsetWidth + dc.scrollLeft;
		gDragMaxT = ih - el.offsetHeight + dc.scrollTop;
	}else{
		// allow drag anywhere on the screen
		gDragMinL = 0;
		gDragMaxL = ncBwHlpr.Page.Width();
		gDragMinT = 0;
		gDragMaxT = ncBwHlpr.Page.Height();
	}
	gDragFunc = MoveFunc;
	gDragStopFunc = StopFunc;
	gDragScrollTop = document.body.scrollTop;
	gDragScrollLeft = document.body.scrollLeft;
	gDragX = oEvent.clientX;
	gDragY = oEvent.clientY;
	if(el){
		gDragEl = el;
		temp1 = parseInt(ncBwHlpr.GetStyle(gDragEl, "left"), 10);
		temp2 = parseInt(ncBwHlpr.GetStyle(gDragEl, "top"), 10);
	}else{
		temp1 = emptyLeft;
		temp2 = emptyTop;
	}
	
	
	// attach move and stop events
	//document.onmousemove = Drag;
	ncBwHlpr.AttachEvent(document, "mousemove", Drag);
	
	// wire up drag stop if not a manual stop request
	if(!p_bManualDragStop){
		if(oEvent.type == "mousedown"){
			ncBwHlpr.AttachEvent(document, "mouseup", DragStop);
		}else{
			ncBwHlpr.AttachEvent(document, "mousedown", DragStop);
		}
	}	
	return false;
}
function DragStop(){
	gDragEl = null;
	gDragFunc = null;
	if(gDragStopFunc){
		gDragStopFunc();
		gDragStopFunc = null;
	}
	
	// detach move & stop events
	//document.onmousemove = null;
	//document.onmouseup = null;
	//document.onmousedown = null;
	ncBwHlpr.DetachEvent(document, "mousemove", Drag);
	ncBwHlpr.DetachEvent(document, "mouseup", DragStop);
	ncBwHlpr.DetachEvent(document, "mousedown", DragStop);
	
	return true;
}
// ----- /dragging -----

// ----- z-index mgr -----
function ncZIdxMgr(pName, pMinIdx, pIdxOffset){
	var z = this;
	z.Name = pName;
	z.MinIdx = pMinIdx;
	z.IdxOffset = pIdxOffset;
	z.Els = [];	
}
ncZIdxMgr.prototype.AddEl = function(pEl){
	this.Els[this.Els.length] = [ncBwHlpr.GetStyle(pEl, "z-index"), pEl];
	ncBwHlpr.AttachEvent(pEl, "mousedown", new Function(this.Name + ".BringToFront('" + pEl.id + "');"));
};
ncZIdxMgr.prototype.BringToFront = function(pId){
	var z = this;
	var els = z.Els;
	els.sort(this._Sort);
	var mul = 0
	for(var i = 0; i < els.length; i++){
		var el = els[i];
		var idx;
		if(el[1].id == pId){
			idx = z.MinIdx + (els.length - 1) * z.IdxOffset;
		}else{
			idx = z.MinIdx + mul++ * z.IdxOffset;
		}
		el[1].style.zIndex = el[0] = idx;
	}
};
ncZIdxMgr.prototype.SendToBack = function(pId){
	var z = this;
	var els = z.Els;
	els.sort(this._Sort);
	var mul = els.length;
	for(var i = els.length; i > -1 ; i--){
		var el = els[i];
		var idx;
		if(el[1].id == pId){
			idx = z.MinIdx;
		}else{
			idx = z.MinIdx + mul-- * z.IdxOffset;
		}
		el[1].style.zIndex = el[0] = idx;
	}
};
ncZIdxMgr.prototype._Sort = function(a, b){
	return a[0] - b[0];
};
// ----- z-index mgr -----
