zpdrag.js
Summary
Zapatec Drag library. Used to drag elements. Requires utils.js.
Copyright (c) 2004-2007 by Zapatec, Inc.
http://www.zapatec.com
1700 MLK Way, Berkeley, California,
94709, U.S.A.
All rights reserved.
Zapatec.Drag = {};
Zapatec.Utils.emulateWindowEvent(['mousedown', 'mousemove', 'mouseup']);
Zapatec.Drag.currentId = null;
Zapatec.Drag.start = function(oEv, sId, oArg) {
var oDrag = Zapatec.Drag;
var oUtils = Zapatec.Utils;
if (oDrag.currentId) {
return true;
}
var oEl = Zapatec.Widget.getElementById(sId);
if (!oEl || oEl.zpDrag) {
return true;
}
if (!oArg) {
oArg = {};
}
var oPos = oUtils.getMousePos(oEv || window.event);
Zapatec.EventDriven.fireEvent('dragStart', {
el: oEl,
event: oEv
});
oEl.zpDrag = true;
if (oArg.resize) {
oEl.zpDragResize = true;
}
oEl.zpDragPageX = oPos.pageX;
oEl.zpDragPageY = oPos.pageY;
oEl.zpDragWidth = oEl.clientWidth;
oEl.zpDragHeight = oEl.clientHeight;
var sTag;
var oOffsetParent = oEl.offsetParent;
if (oOffsetParent) {
sTag = oOffsetParent.tagName.toLowerCase();
}
if (sTag && sTag != 'body' && sTag != 'html') {
oPos = oUtils.getElementOffset(oEl);
var oPosParent = oUtils.getElementOffset(oOffsetParent);
oEl.zpDragLeft = oPos.left - oPosParent.left;
oEl.zpDragTop = oPos.top - oPosParent.top;
} else {
oEl.zpDragLeft = oEl.offsetLeft;
oEl.zpDragTop = oEl.offsetTop;
}
oEl.zpDragRight = oEl.zpDragLeft + oEl.zpDragWidth;
oEl.zpDragBottom = oEl.zpDragTop + oEl.zpDragHeight;
oEl.zpDragPrevLeft = oEl.zpDragPrevRealLeft = oEl.zpDragLeft;
oEl.zpDragPrevTop = oEl.zpDragPrevRealTop = oEl.zpDragTop;
oEl.zpDragV = oArg.vertical;
oEl.zpDragH = oArg.horizontal;
oEl.zpDragLimTop =
typeof oArg.limitTop == 'number' ? oArg.limitTop : -Infinity;
oEl.zpDragLimBot =
typeof oArg.limitBottom == 'number' ? oArg.limitBottom : Infinity;
oEl.zpDragLimLft =
typeof oArg.limitLeft == 'number' ? oArg.limitLeft : -Infinity;
oEl.zpDragLimRgh =
typeof oArg.limitRight == 'number' ? oArg.limitRight : Infinity;
if (typeof oArg.step == 'number') {
oEl.zpDragStepV = oEl.zpDragStepH = oArg.step;
}
if (typeof oArg.stepVertical == 'number') {
oEl.zpDragStepV = oArg.stepVertical;
}
if (typeof oArg.stepHorizontal == 'number') {
oEl.zpDragStepH = oArg.stepHorizontal;
}
oDrag.currentId = sId;
oUtils.addEvent(document, 'mousemove', oDrag.move);
oUtils.addEvent(document, 'mouseup', oDrag.end);
return true;
};
Zapatec.Drag.move = function(oEv) {
var oDrag = Zapatec.Drag;
var oUtils = Zapatec.Utils;
oEv || (oEv = window.event);
if (!oDrag.currentId) {
return oUtils.stopEvent(oEv);
}
var oEl = document.getElementById(oDrag.currentId);
if (!(oEl && oEl.zpDrag)) {
return oUtils.stopEvent(oEv);
}
var oSt = oEl.style;
var oPos = oUtils.getMousePos(oEv);
var oParam = {
el: oEl,
startLeft: oEl.zpDragLeft,
startTop: oEl.zpDragTop,
prevLeft: oEl.zpDragPrevLeft,
prevTop: oEl.zpDragPrevTop,
left: oEl.zpDragLeft,
top: oEl.zpDragTop,
realLeft: oEl.zpDragLeft,
realTop: oEl.zpDragTop,
event: oEv
};
var iOffset, iPos, iStep, iSize;
iOffset = oPos.pageX - oEl.zpDragPageX;
iStep = oEl.zpDragStepH;
if (iStep) {
iPos = oEl.zpDragLeft + Math.floor(iOffset / iStep) * iStep;
oParam.realLeft = oEl.zpDragPrevRealLeft = oEl.zpDragLeft + iOffset;
} else {
oParam.realLeft = oEl.zpDragPrevRealLeft = iPos = oEl.zpDragLeft + iOffset;
}
if (!oEl.zpDragV) {
if (oEl.zpDragLimLft <= iPos && oEl.zpDragLimRgh >= iPos) {
if (oSt.right) {
oSt.right = '';
}
if (oEl.zpDragResize) {
if (iOffset > 0) {
iSize = oEl.zpDragWidth + iOffset;
if (iStep) {
iSize = Math.floor(iSize / iStep) * iStep;
}
oSt.left = oEl.zpDragLeft + 'px';
} else {
iSize = oEl.zpDragWidth - iOffset;
if (iStep) {
iSize = Math.ceil(iSize / iStep) * iStep;
}
oSt.left = oEl.zpDragLeft - iSize + 'px';
}
oSt.width = iSize + 'px';
} else {
oSt.left = iPos + 'px';
}
oParam.left = iPos;
oEl.zpDragPrevLeft = iPos;
} else {
oParam.left = oParam.prevLeft;
}
}
iOffset = oPos.pageY - oEl.zpDragPageY;
iStep = oEl.zpDragStepV;
if (iStep) {
iPos = oEl.zpDragTop + Math.floor(iOffset / iStep) * iStep;
oParam.realTop = oEl.zpDragPrevRealTop = oEl.zpDragTop + iOffset;
} else {
iPos = oParam.realTop = oEl.zpDragPrevRealTop = oEl.zpDragTop + iOffset;
}
if (!oEl.zpDragH) {
if (oEl.zpDragLimTop <= iPos && oEl.zpDragLimBot >= iPos) {
if (oSt.bottom) {
oSt.bottom = '';
}
if (oEl.zpDragResize) {
if (iOffset > 0) {
iSize = oEl.zpDragHeight + iOffset;
if (iStep) {
iSize = Math.floor(iSize / iStep) * iStep;
}
oSt.top = oEl.zpDragTop + 'px';
} else {
iSize = oEl.zpDragHeight - iOffset;
if (iStep) {
iSize = Math.ceil(iSize / iStep) * iStep;
}
oSt.top = oEl.zpDragBottom - iSize + 'px';
}
oSt.height = iSize + 'px';
} else {
oSt.top = iPos + 'px';
}
oParam.top = iPos;
oEl.zpDragPrevTop = iPos;
} else {
oParam.top = oParam.prevTop;
}
}
Zapatec.EventDriven.fireEvent('dragMove', oParam);
return oUtils.stopEvent(oEv);
};
Zapatec.Drag.end = function(oEv) {
var oDrag = Zapatec.Drag;
var oUtils = Zapatec.Utils;
oEv || (oEv = window.event);
if (!oDrag.currentId) {
return oUtils.stopEvent(oEv);
}
var oEl = document.getElementById(oDrag.currentId);
if (!(oEl && oEl.zpDrag)) {
return oUtils.stopEvent(oEv);
}
oUtils.removeEvent(document, 'mousemove', oDrag.move);
oUtils.removeEvent(document, 'mouseup', oDrag.end);
var oParam = {
el: oEl,
startLeft: oEl.zpDragLeft,
startTop: oEl.zpDragTop,
left: oEl.zpDragPrevLeft,
top: oEl.zpDragPrevTop,
realLeft: oEl.zpDragPrevRealLeft,
realTop: oEl.zpDragPrevRealTop,
event: oEv
};
oDrag.currentId = null;
oEl.zpDrag = null;
oEl.zpDragPageY = null;
oEl.zpDragPageX = null;
oEl.zpDragTop = null;
oEl.zpDragLeft = null;
oEl.zpDragPrevTop = null;
oEl.zpDragPrevLeft = null;
oEl.zpDragPrevRealTop = null;
oEl.zpDragPrevRealLeft = null;
oEl.zpDragV = null;
oEl.zpDragH = null;
oEl.zpDragLimTop = null;
oEl.zpDragLimBot = null;
oEl.zpDragLimLft = null;
oEl.zpDragLimRgh = null;
oEl.zpDragStepV = null;
oEl.zpDragStepH = null;
Zapatec.EventDriven.fireEvent('dragEnd', oParam);
return oUtils.stopEvent(oEv);
};
Documentation generated by
JSDoc on Thu Aug 16 12:18:39 2007