draggable.js
Summary
No overview generated for 'draggable.js'
Zapatec.Draggable = {};
Zapatec.Draggable.makeDraggable = function() {
if (!this.requireInterface("Zapatec.Movable")) {
return false;
}
if (!this.requireInterface("Zapatec.CommandEvent")) {
return false;
}
var draggables = Zapatec.Array(this.getDraggableElements());
var hooks = Zapatec.Array(this._getDraggableHooks());
var self = this, result = false;
var config = this.getDragConfig();
if (config.method != "cut") {
this.setDragConfig({eventCapture : false});
}
var listenersObj = this._getRestorer().getSavedProps()["dragListeners"] = {
mousedown : function(ev) {
return self.dragStart(ev);
},
mousemove : function(ev) {
if (self.isDragging()) {
return self.dragMove(ev);
}
},
mouseup : function(ev) {
if (self.isDragging()) {
return self.dragEnd(ev);
}
}
};
hooks.each(function(index, hook) {
if (!Zapatec.isHtmlElement(hook)) {
return;
}
result = true;
if (Zapatec.is_gecko) {
hook.style.setProperty("-moz-user-select", "none", "");
}
Zapatec.Utils.addEvent(hook, 'mousedown', listenersObj.mousedown);
if (config.eventCapture) {
Zapatec.Utils.addEvent(hook, 'mousemove', listenersObj.mousemove);
Zapatec.Utils.addEvent(hook, 'mouseup', listenersObj.mouseup);
}
});
draggables.each(function(index, draggable) {
if (!Zapatec.isHtmlElement(draggable)) {
return;
}
self.createProperty(draggable, "dragObj", self);
});
return result;
};
Zapatec.Draggable.dragStart = function(ev) {
if (!this.canDrag()) {
return true;
}
ev = ev || window.event;
var iButton = ev.button || ev.which;
if (iButton > 1) {
return false;
}
var self = this;
var config = this.getDragConfig();
if (this.fireEvent("beforeDragInit", ev) === false) {
return true;
}
if (Zapatec.GlobalEvents.fireEvent("beforeDragInit", ev, this) === false) {
return true;
}
this._setDragging(true);
if (config.eventCapture && (config.method == "dummy" || config.method == "copy")) {
var draggables = Zapatec.Array(this.getDraggableElements());
draggables.each(function(index, draggable) {
draggable.restorer.saveProp("style.zIndex");
draggable.style.zIndex = 2000001;
});
}
this._proceedDraggableElements("dragStart");
var oPos = Zapatec.Utils.getMousePos(ev);
var mouseX = oPos.pageX;
var mouseY = oPos.pageY;
this.makeMovable();
this.startMove();
var elements = Zapatec.Array(this.getMovableElements());
elements.each(function(index, movable) {
if (Zapatec.isHtmlElement(movable)) {
movable.restorer.saveProp("style.zIndex");
movable.style.zIndex = 1000000 + (parseInt(movable.style.zIndex, 10) || 0);
self._proceedDragStyles(movable, "dragStart");
if (config.eventCapture) {
movable.restorer.saveProp("style.cursor");
movable.style.cursor = "move";
}
} else if (Zapatec.isMovableObj(movable)) {
var elems = Zapatec.Array(movable.getMovableElements());
elems.each(arguments.calee);
}
});
Zapatec.Utils.cover.show(
config.eventCapture ? 999999 : 2000000,
"move",
function(ev) {
return self.dragMove(ev);
},
function(ev) {
return self.dragEnd(ev);
}
);
this._setMovingPoint(mouseX, mouseY);
this.fireEvent("onDragInit", ev);
Zapatec.GlobalEvents.fireEvent("onDragInit", ev, this);
if (config.stopEvent) {
return Zapatec.Utils.stopEvent(ev);
} else {
return true;
}
};
Zapatec.Draggable.dragMove = function(ev){
if (!this.isDragging()) {
return true;
}
ev = ev || window.event;
if (this.fireEvent("beforeDragMove", ev) === false) {
return true;
}
if (Zapatec.GlobalEvents.fireEvent("beforeDragMove", ev, this) === false) {
return true;
}
if (Zapatec.Utils.cover.style.zIndex != 2000000) {
var config = this.getDragConfig();
if (config.eventCapture && (config.method == "dummy" || config.method == "copy")) {
var draggables = Zapatec.Array(this.getDraggableElements());
draggables.each(function(index, draggable) {
draggable.restorer.restoreProp("style.zIndex");
});
}
Zapatec.Utils.cover.style.zIndex = 2000000;
}
var oPos = Zapatec.Utils.getMousePos(ev);
var mouseX = oPos.pageX;
var mouseY = oPos.pageY;
var movePoint = this.getMovingPoint();
this.moveFor(mouseX - movePoint.x, mouseY - movePoint.y);
this._setMovingPoint(mouseX, mouseY);
this.fireEvent("onDragMove", ev);
Zapatec.GlobalEvents.fireEvent("onDragMove", ev, this);
return Zapatec.Utils.stopEvent(ev);
};
Zapatec.Draggable.dragEnd = function(ev){
if (!this.isDragging()) {
return true;
}
ev = ev || window.event;
var self = this;
if (this.fireEvent("beforeDragEnd", ev) === false) {
return true;
}
if (Zapatec.GlobalEvents.fireEvent("beforeDragEnd", ev, this) === false) {
return true;
}
var config = this.getDragConfig();
if (config.eventCapture && (config.method == "dummy" || config.method == "copy")) {
var draggables = Zapatec.Array(this.getDraggableElements());
draggables.each(function(index, draggable) {
draggable.restorer.restoreProp("style.zIndex", true);
});
}
var elements = Zapatec.Array(this.getMovableElements());
elements.each(function(index, movable) {
if (Zapatec.isHtmlElement(movable)) {
movable.restorer.restoreProp("style.zIndex");
movable.restorer.restoreProp("style.cursor");
self._proceedDragStyles(movable, "dragEnd");
} else if (Zapatec.isMovableObj(movable)) {
var elems = Zapatec.Array(movable.getMovableElements());
elems.each(arguments.calee);
}
});
this._proceedDraggableElements("dragEnd");
Zapatec.Utils.cover.hide();
this._setMovingPoint(null, null);
this._setDragging(false);
this.endMove();
this.fireEvent("onDragEnd", ev);
Zapatec.GlobalEvents.fireEvent("onDragEnd", ev, this);
return Zapatec.Utils.stopEvent(ev);
};
Zapatec.Draggable.restorePos = function(){
this.restoreOfMove();
};
Zapatec.Draggable.restoreOfDrag = function() {
var listenersObj = this._getRestorer().getSavedProps()["dragListeners"];
if (!listenersObj) {
return false;
}
this.restoreOfMove();
var hooks = Zapatec.Array(this._getDraggableHooks());
var draggables = Zapatec.Array(this.getDraggableElements());
var self = this;
var config = this.getDragConfig();
hooks.each(function(index, hook) {
if (!Zapatec.isHtmlElement(hook)) {
return;
}
if (Zapatec.is_gecko) {
hook.style.setProperty("-moz-user-select", "", "");
}
Zapatec.Utils.removeEvent(hook, 'mousedown', listenersObj.mousedown);
if (config.eventCapture) {
Zapatec.Utils.removeEvent(hook, 'mousemove', listenersObj.mousemove);
Zapatec.Utils.removeEvent(hook, 'mouseup', listenersObj.mouseup);
}
});
draggables.each(function(index, draggable) {
if (!Zapatec.isHtmlElement(draggable)) {
return;
}
draggable.dragObj = null;
});
return true;
};
Zapatec.Draggable.getDraggableElements = function() {
return this.getContainer();
};
Zapatec.Draggable._getDraggableHooks = function() {
return this.getContainer();
};
Zapatec.Draggable.getContainer = function() {
return this.getDragConfig().container;
};
Zapatec.Draggable.isDragging = function() {
return this.dragging;
};
Zapatec.Draggable.canDrag = function() {
return this.canDrag;
};
Zapatec.Draggable._setCanDrag = function(on) {
this.canDrag = on;
};
Zapatec.Draggable.getDragConfig = function() {
return this.getConfiguration();
};
Zapatec.Draggable.setDragConfig = function(config) {
this.reconfigure(config);
};
Zapatec.Draggable._setDragging = function(on) {
this.dragging = on;
};
Zapatec.Draggable._handleCoordOverflow = function(limit, dimension) {
if (!this.isDragging()) {
Zapatec.Movable._handleCoordOverflow.call(this, limit, dimension);
}
return limit;
};
Zapatec.Draggable._getRestorer = function() {
if (!this.restorer) {
this.restorer = new Zapatec.SRProp(this);
}
return this.restorer;
};
Zapatec.Draggable._proceedDraggableElements = function(dragState) {
var config = this.getDragConfig(),
restorer = this._getRestorer(),
copies = null, measurement = null, self = this,
listenersObj = restorer.getProp("dragListeners");
function toggleEvents(action, hooks, listenersObj) {
hooks.each(function(index, hook) {
Zapatec.Utils[action + "Event"](hook, "mousedown", listenersObj.mousedown);
if (config.eventCapture) {
Zapatec.Utils[action + "Event"](hook, 'mousemove', listenersObj.mousemove);
Zapatec.Utils[action + "Event"](hook, 'mouseup', listenersObj.mouseup);
}
});
}
switch (config.method) {
case "copy" : case "dummy" : {
if (dragState == "dragStart") {
var elements = Zapatec.Array(this.getDraggableElements());
var hooks = Zapatec.Array(this._getDraggableHooks());
copies = Zapatec.Array();
toggleEvents("remove", hooks, listenersObj);
elements.each(function(index, movable) {
if (Zapatec.isHtmlElement(movable)) {
var newNode = movable.cloneNode(config.copyChilds);
newNode.dragObj = self;
if (config.eventCapture) {
Zapatec.Utils.addEvent(newNode, 'mousemove', listenersObj.mousemove);
Zapatec.Utils.addEvent(newNode, 'mouseup', listenersObj.mouseup);
}
movable.parentNode.insertBefore(newNode, movable);
newNode.style.visibility = "visible";
copies.push(newNode);
if (movable == self.getMovableMeasurement()) {
measurement = newNode;
}
} else if (Zapatec.isMovableObj(movable)) {
var elems = Zapatec.Array(movable.getMovableElements());
elems.each(arguments.calee);
}
});
toggleEvents("add", hooks, listenersObj);
if (!measurement) {
measurement = this.getMovableMeasurement();
}
restorer.saveProp("getMovableElements");
restorer.saveProp("isMovableSafely()");
this._setMovableSafely(false);
this.getMovableElements = function(resetArray) {
var arr = copies;
copies = resetArray ? null : copies;
return arr;
};
restorer.saveProp("getMovableMeasurement");
this.getMovableMeasurement = function() {
return measurement;
};
} else if (dragState == "dragEnd") {
var elements = Zapatec.Array(this.getMovableElements(true));
elements.each(function(index, movable) {
if (config.method == "dummy") {
movable.parentNode.removeChild(movable);
}
movable.dragObj = null;
if (config.eventCapture) {
Zapatec.Utils.removeEvent(movable, 'mousemove', listenersObj.mousemove);
Zapatec.Utils.removeEvent(movable, 'mouseup', listenersObj.mouseup);
}
});
this.restoreOfMove();
restorer.restoreProp("getMovableElements");
this._setMovableSafely(restorer.getProp("isMovableSafely()"));
restorer.restoreProp("isMovableSafely()");
restorer.restoreProp("getMovableMeasurement");
}
break;
}
default : {
break;
}
}
};
Zapatec.Draggable._proceedDragStyles = function(movable, dragState) {
var config = this.getDragConfig();
if (config.overwriteCSS) {
if (dragState == "dragStart") {
movable.restorer.saveProp("className");
movable.className = config.overwriteCSS;
} else if (dragState == "dragEnd") {
movable.restorer.restoreProp("className");
}
}
if (config.dragCSS) {
if (dragState == "dragStart") {
Zapatec.Utils.addClass(movable, config.dragCSS);
} else if (dragState == "dragEnd") {
Zapatec.Utils.removeClass(movable, config.dragCSS);
}
}
};
Zapatec.Draggable._setMovingPoint = function(x, y) {
var movingPoint = this._getMovingPointObject();
if (x === null || y === null) {
movingPoint.x = null;
movingPoint.y = null;
movingPoint.offsetX = null;
movingPoint.offsetY = null;
return;
}
if (movingPoint.x === null || movingPoint.y === null) {
var pos = this.getPagePosition();
movingPoint.x = x;
movingPoint.y = y;
movingPoint.offsetX = x - pos.x;
movingPoint.offsetY = y - pos.y;
} else {
var pos = this.getPagePosition();
movingPoint.x = pos.x + movingPoint.offsetX;
movingPoint.y = pos.y + movingPoint.offsetY;
}
return;
};
Zapatec.Draggable.getMovingPoint = function() {
var movingPoint = this._getMovingPointObject();
return {x : movingPoint.x, y : movingPoint.y};
};
Zapatec.Draggable._getMovingPointObject = function() {
if (!this.movingPoint || typeof this.movingPoint != "object") {
this.movingPoint = {x : null, y : null, offsetX : null, offsetY : null};
}
return this.movingPoint;
};
Zapatec.Utils.Draggable = function(config) {
if (arguments.length > 1) {
var args = arguments[1];
args.container = config;
config = args;
}
if (typeof config.left != "undefined" || typeof config.right != "undefined" ||
typeof config.top != "undefined" || typeof config.bottom != "undefined") {
config.limit = {
minX : config.left,
maxX : config.right,
minY : config.top,
maxY : config.bottom
};
}
if (config.dragLayer) {config.moveLayer = config.dragLayer;}
if (!config.eventListeners) {
config.eventListeners = {};
}
if (config.beforeDragInit) {config.eventListeners.beforeDragInit = config.beforeDragInit;}
if (config.beforeDragMove) {config.eventListeners.beforeDragMove = config.beforeDragMove;}
if (config.beforeDragEnd) {config.eventListeners.beforeDragEnd = config.beforeDragEnd;}
if (config.onDragInit) {config.eventListeners.onDragInit = config.onDragInit;}
if (config.onDragMove) {config.eventListeners.onDragMove = config.onDragMove;}
if (config.onDragEnd) {config.eventListeners.onDragEnd = config.onDragEnd;}
if (config.stopEv) {config.stopEvent = config.stopEv;}
config = Zapatec.Hash.remove(config,
"left", "top", "right", "bottom", "dragLayer",
"beforeDragInit", "beforeDragMove", "beforeDragEnd",
"onDragInit", "onDragMove", "onDragEnd", "stopEv"
);
Zapatec.Utils.Draggable.SUPERconstructor.call(this, config);
};
Zapatec.Utils.Draggable.id = "Zapatec.Utils.Draggable";
Zapatec.inherit(Zapatec.Utils.Draggable, Zapatec.Utils.Movable);
Zapatec.implement(Zapatec.Utils.Draggable, "Zapatec.Draggable");
Zapatec.Utils.Draggable.prototype.init = function(config) {
Zapatec.Utils.Draggable.SUPERclass.init.call(this, config);
this.makeDraggable();
};
Zapatec.Utils.Draggable.prototype.configure = function(config) {
this.defineConfigOption("method", "cut");
this.defineConfigOption("stopEvent", true);
this.defineConfigOption("eventCapture", false);
this.defineConfigOption("handler", null);
this.defineConfigOption("dragCSS", null);
this.defineConfigOption("overwriteCSS", null);
this.defineConfigOption("copyChilds", true);
this.defineConfigOption("makeMovable", false);
Zapatec.Utils.Draggable.SUPERclass.configure.call(this, config);
config = this.getConfiguration();
if (Zapatec.is_opera) {
config.eventCapture = true;
}
config.handler = Zapatec.Widget.getElementById(config.handler);
config.handler = Zapatec.Utils.img2div(config.handler);
if (!Zapatec.isHtmlElement(config.handler)) {
config.handler = config.container;
}
};
Zapatec.Utils.Draggable.prototype.reconfigure = function(config) {
Zapatec.Utils.Draggable.SUPERclass.reconfigure.call(this, config);
};
Zapatec.Utils.Draggable.prototype.getDraggableElements = function() {
return this.movableElements;
};
Zapatec.Utils.Draggable.prototype._getDraggableHooks = function() {
return this.getConfiguration().handler;
};
Zapatec.Utils.initDragObjects = function(className, el, recursive, config){
if (!className) return;
var elements = Zapatec.Utils.getElementsByAttribute('className', className, el, recursive, true);
return Zapatec.Utils.applyToElements(Zapatec.Utils.Draggable, elements, config);
}
Documentation generated by
JSDoc on Thu Aug 16 12:18:39 2007