drop.js revision c8b61a25e72a46a8725ead6f5bbae7d00b502a33
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * The Drag & Drop Utility allows you to create a draggable interface efficiently, buffering you from browser-level abnormalities and enabling you to focus on the interesting logic surrounding your particular implementation. This component enables you to create a variety of standard draggable objects with just a few lines of code and then, using its extensive API, add your own specific implementation logic.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @module dd
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @submodule dd-drop
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * This class provides the ability to create a Drop Target.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @class Drop
daeb6d531149c45a2ceb543ae2cf1e56e5235bbeDav Glass * @extends Base
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @constructor
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var NODE = 'node',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass DDM = Y.DD.DDM,
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass OFFSET_HEIGHT = 'offsetHeight',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass OFFSET_WIDTH = 'offsetWidth',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @event drop:over
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @description Fires when a drag element is over this target.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @bubbles DDM
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @type Event.Custom
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass EV_DROP_OVER = 'drop:over',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @event drop:enter
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @description Fires when a drag element enters this target.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @bubbles DDM
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @type Event.Custom
f69da96c272d2efe7f43da5150c13c0fe6899646Dav Glass */
56fa0b5ce00608c58c7c82cc5341c5fbf8898719Dav Glass EV_DROP_ENTER = 'drop:enter',
56fa0b5ce00608c58c7c82cc5341c5fbf8898719Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @event drop:exit
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @description Fires when a drag element exits this target.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @bubbles DDM
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass * @type Event.Custom
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass EV_DROP_EXIT = 'drop:exit',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @event drop:hit
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @description Fires when a draggable node is dropped on this Drop Target. (Fired from dd-ddm-drop)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @bubbles DDM
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @type Event.Custom
a3d67a254e415c93408a9d4314e46e3cb7d87d99Dav Glass */
a3d67a254e415c93408a9d4314e46e3cb7d87d99Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass Drop = function() {
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass Drop.superclass.constructor.apply(this, arguments);
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass //DD init speed up.
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass Y.later(100, this, this._createShim);
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass DDM._regTarget(this);
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass /* TODO
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass if (Dom.getStyle(this.el, 'position') == 'fixed') {
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass Event.on(window, 'scroll', function() {
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass this.activateShim();
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass }, this, true);
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass }
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass */
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass };
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass Drop.NAME = 'drop';
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass Drop.ATTRS = {
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass /**
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass * @attribute node
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass * @description Y.Node instanace to use as the element to make a Drop Target
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass * @type Node
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass */
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass node: {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass setter: function(node) {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass var n = Y.Node.get(node);
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass if (!n) {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass Y.fail('DD.Drop: Invalid Node Given: ' + node);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return n;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass * @attribute groups
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Array of groups to add this drop into.
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @type Array
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass */
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass groups: {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass value: ['default'],
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass setter: function(g) {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass this._groups = {};
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass Y.each(g, function(v, k) {
edefd42ddde54932d14d9150369570db47822ab5Dav Glass this._groups[v] = true;
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass }, this);
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass return g;
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass }
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass },
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass /**
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass * @attribute padding
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass * @description CSS style padding to make the Drop Target bigger than the node.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @type String
edefd42ddde54932d14d9150369570db47822ab5Dav Glass */
edefd42ddde54932d14d9150369570db47822ab5Dav Glass padding: {
edefd42ddde54932d14d9150369570db47822ab5Dav Glass value: '0',
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass setter: function(p) {
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass return DDM.cssSizestoObject(p);
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass }
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass },
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass /**
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @attribute lock
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @description Set to lock this drop element.
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @type Boolean
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass */
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass lock: {
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass value: false,
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass setter: function(lock) {
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass if (lock) {
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass this.get(NODE).addClass(DDM.CSS_PREFIX + '-drop-locked');
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass } else {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop-locked');
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass return lock;
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass },
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @attribute bubbles
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Controls the default bubble parent for this Drop instance. Default: Y.DD.DDM. Set to false to disable bubbling.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @type Object
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass bubbles: {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass writeOnce: true,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass value: Y.DD.DDM
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass };
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass Y.extend(Drop, Y.Base, {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @method _createEvents
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description This method creates all the events for this Event Target and publishes them so we get Event Bubbling.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass _createEvents: function() {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass var ev = [
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass EV_DROP_OVER,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass EV_DROP_ENTER,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass EV_DROP_EXIT,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass 'drop:hit'
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass ];
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass Y.each(ev, function(v, k) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this.publish(v, {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass type: v,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass emitFacade: true,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass preventable: false,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass bubbles: true,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass queuable: false,
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass prefix: 'drop'
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass });
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass }, this);
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass if (this.get('bubbles')) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this.addTarget(this.get('bubbles'));
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass },
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @property _valid
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Flag for determining if the target is valid in this operation.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @type Boolean
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass _valid: null,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @property _groups
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description The groups this target belongs to.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @type Array
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass _groups: null,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @property shim
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass * @description Node reference to the targets shim
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass * @type {Object}
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass shim: null,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @property region
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description A region object associated with this target, used for checking regions while dragging.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @type Object
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass region: null,
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass /**
690dda02d518be26b6ee1c6530ee361081c9eb03Dav Glass * @property overTarget
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description This flag is tripped when a drag element is over this target.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @type Boolean
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass overTarget: null,
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @method inGroup
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Check if this target is in one of the supplied groups.
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @param {Array} groups The groups to check against
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @return Boolean
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass inGroup: function(groups) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this._valid = false;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass var ret = false;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass Y.each(groups, function(v, k) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (this._groups[v]) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass ret = true;
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this._valid = true;
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }, this);
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass return ret;
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass },
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @method initializer
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Private lifecycle method
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass initializer: function() {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass //this._createEvents();
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass Y.later(100, this, this._createEvents);
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass var node = this.get(NODE), id;
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass if (!node.get('id')) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass id = Y.stamp(node);
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass node.set('id', id);
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass node.addClass(DDM.CSS_PREFIX + '-drop');
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass },
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass * @method destructor
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass * @description Lifecycle destructor, unreg the drag from the DDM and remove listeners
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass */
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass destructor: function() {
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass DDM._unregTarget(this);
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass if (this.shim) {
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass this.shim.get('parentNode').removeChild(this.shim);
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.shim = null;
5cbdc947eb0c9c5e840d59ff8e1dd49a0e2a1887Dav Glass }
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop');
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass },
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass /**
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @private
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @method _deactivateShim
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @description Removes classes from the target, resets some flags and sets the shims deactive position [-999, -999]
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass */
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass _deactivateShim: function() {
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass if (!this.shim) {
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass return false;
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass }
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop-active-valid');
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop-active-invalid');
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop-over');
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.shim.setStyles({
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass top: '-999px',
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass left: '-999px',
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass zIndex: '2'
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass });
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass this.overTarget = false;
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass },
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass /**
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @private
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @method _activateShim
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @description Activates the shim and adds some interaction CSS classes
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass */
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass _activateShim: function() {
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass if (!DDM.activeDrag) {
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass return false; //Nothing is dragging, no reason to activate.
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass }
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass if (this.get(NODE) === DDM.activeDrag.get(NODE)) {
573bad453b98b1e493f4abfcf507f85b22b6bf4aDav Glass return false;
a0c3229e02af852e4b15bf6d4cf4e862440bb00eDav Glass }
a0c3229e02af852e4b15bf6d4cf4e862440bb00eDav Glass if (this.get('lock')) {
a0c3229e02af852e4b15bf6d4cf4e862440bb00eDav Glass return false;
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass }
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass var node = this.get(NODE);
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass //TODO Visibility Check..
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass //if (this.inGroup(DDM.activeDrag.get('groups')) && this.get(NODE).isVisible()) {
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass if (this.inGroup(DDM.activeDrag.get('groups'))) {
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass node.removeClass(DDM.CSS_PREFIX + '-drop-active-invalid');
5cbdc947eb0c9c5e840d59ff8e1dd49a0e2a1887Dav Glass node.addClass(DDM.CSS_PREFIX + '-drop-active-valid');
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass DDM._addValid(this);
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass this.overTarget = false;
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass this.sizeShim();
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass } else {
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass DDM._removeValid(this);
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass node.removeClass(DDM.CSS_PREFIX + '-drop-active-valid');
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass node.addClass(DDM.CSS_PREFIX + '-drop-active-invalid');
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass }
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass },
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass /**
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass * @method sizeShim
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass * @description Positions and sizes the shim with the raw data from the node, this can be used to programatically adjust the Targets shim for Animation..
5cbdc947eb0c9c5e840d59ff8e1dd49a0e2a1887Dav Glass */
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass sizeShim: function() {
e08067d50c8d5e4692441db53bba084c7a667e0aDav Glass if (!DDM.activeDrag) {
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass return false; //Nothing is dragging, no reason to activate.
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass }
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass if (this.get(NODE) === DDM.activeDrag.get(NODE)) {
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass return false;
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass }
b80d65233fd7492f4b6487349f5364b9a8ca019eDav Glass if (this.get('lock')) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return false;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (!this.shim) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.later(100, this, this.sizeShim);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return false;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var node = this.get(NODE),
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass nh = node.get(OFFSET_HEIGHT),
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass nw = node.get(OFFSET_WIDTH),
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass xy = node.getXY(),
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass p = this.get('padding'),
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass dd, dH, dW;
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass //Apply padding
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass nw = nw + p.left + p.right;
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass nh = nh + p.top + p.bottom;
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass xy[0] = xy[0] - p.left;
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass xy[1] = xy[1] - p.top;
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass if (DDM.activeDrag.get('dragMode') === DDM.INTERSECT) {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass //Intersect Mode, make the shim bigger
b909d10cf34b5de748b5324ab34c987f9a601449Dav Glass dd = DDM.activeDrag;
b909d10cf34b5de748b5324ab34c987f9a601449Dav Glass dH = dd.get(NODE).get(OFFSET_HEIGHT);
b909d10cf34b5de748b5324ab34c987f9a601449Dav Glass dW = dd.get(NODE).get(OFFSET_WIDTH);
b909d10cf34b5de748b5324ab34c987f9a601449Dav Glass
b909d10cf34b5de748b5324ab34c987f9a601449Dav Glass nh = (nh + dH);
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass nw = (nw + dW);
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass xy[0] = xy[0] - (dW - dd.deltaXY[0]);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass xy[1] = xy[1] - (dH - dd.deltaXY[1]);
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass //Set the style on the shim
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass this.shim.setStyles({
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass height: nh + 'px',
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass width: nw + 'px',
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass top: xy[1] + 'px',
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass left: xy[0] + 'px'
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass });
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass //Create the region to be used by intersect when a drag node is over us.
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass this.region = {
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass '0': xy[0],
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass '1': xy[1],
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass area: 0,
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass top: xy[1],
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass right: xy[0] + nw,
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass bottom: xy[1] + nh,
fe442de8408a276919d26a1110e8121844b1ba11Dav Glass left: xy[0]
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass };
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass },
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass /**
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass * @private
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass * @method _createShim
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass * @description Creates the Target shim and adds it to the DDM's playground..
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass */
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass _createShim: function() {
9d0be4bedcaad945c505994577198223ffc4ed9eDav Glass var s = Y.Node.create('<div id="' + this.get(NODE).get('id') + '_shim"></div>');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass s.setStyles({
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass height: this.get(NODE).get(OFFSET_HEIGHT) + 'px',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass width: this.get(NODE).get(OFFSET_WIDTH) + 'px',
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass backgroundColor: 'yellow',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass opacity: '.5',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass zIndex: '1',
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass overflow: 'hidden',
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass top: '-900px',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass left: '-900px',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass position: 'absolute'
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass });
998d2791b549446db8394dc80d46a94a247857d9Dav Glass DDM._pg.appendChild(s);
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.shim = s;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass s.on('mouseover', this._handleOverEvent, this, true);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass s.on('mouseout', this._handleOutEvent, this, true);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @private
998d2791b549446db8394dc80d46a94a247857d9Dav Glass * @method _handleOverTarget
998d2791b549446db8394dc80d46a94a247857d9Dav Glass * @description This handles the over target call made from this object or from the DDM
998d2791b549446db8394dc80d46a94a247857d9Dav Glass */
998d2791b549446db8394dc80d46a94a247857d9Dav Glass _handleTargetOver: function() {
998d2791b549446db8394dc80d46a94a247857d9Dav Glass if (DDM.isOverTarget(this)) {
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.get(NODE).addClass(DDM.CSS_PREFIX + '-drop-over');
998d2791b549446db8394dc80d46a94a247857d9Dav Glass DDM.activeDrop = this;
998d2791b549446db8394dc80d46a94a247857d9Dav Glass DDM.otherDrops[this] = this;
a9877c9114840d695f43d6fd96f07f905de0d968Dav Glass if (this.overTarget) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass DDM.activeDrag.fire('drag:over', { drop: this, drag: DDM.activeDrag });
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.fire(EV_DROP_OVER, { drop: this, drag: DDM.activeDrag });
998d2791b549446db8394dc80d46a94a247857d9Dav Glass } else {
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.overTarget = true;
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.fire(EV_DROP_ENTER, { drop: this, drag: DDM.activeDrag });
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass DDM.activeDrag.fire('drag:enter', { drop: this, drag: DDM.activeDrag });
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass DDM.activeDrag.get(NODE).addClass(DDM.CSS_PREFIX + '-drag-over');
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass //TODO - Is this needed??
91085c33d52b89808c10ff61e5a94d7b35d57d65Dav Glass //DDM._handleTargetOver();
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
998d2791b549446db8394dc80d46a94a247857d9Dav Glass } else {
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass this._handleOut();
7058d70d5189510fab628ef8d64bb50dd726a941Dav Glass }
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass },
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass /**
7058d70d5189510fab628ef8d64bb50dd726a941Dav Glass * @private
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method _handleOverEvent
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @description Handles the mouseover DOM event on the Target Shim
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass */
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass _handleOverEvent: function() {
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass this.shim.setStyle('zIndex', '999');
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass DDM._addActiveShim(this);
b7bd9aa409761c479bb0a2e5794295d35ebe24eaDav Glass },
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass /**
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @private
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass * @method _handleOut
998d2791b549446db8394dc80d46a94a247857d9Dav Glass * @description Handles the mouseout DOM event on the Target Shim
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass */
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass _handleOutEvent: function() {
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass this.shim.setStyle('zIndex', '1');
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass DDM._removeActiveShim(this);
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass },
323ca860aba4b2515b560796e2322d5eaae57e5aDav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @private
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @method _handleOut
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass * @description Handles out of target calls/checks
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass */
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass _handleOut: function(force) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass if (!DDM.isOverTarget(this) || force) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass if (this.overTarget) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this.overTarget = false;
998d2791b549446db8394dc80d46a94a247857d9Dav Glass if (!force) {
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass DDM._removeActiveShim(this);
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass }
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass if (DDM.activeDrag) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass this.get(NODE).removeClass(DDM.CSS_PREFIX + '-drop-over');
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass DDM.activeDrag.get(NODE).removeClass(DDM.CSS_PREFIX + '-drag-over');
998d2791b549446db8394dc80d46a94a247857d9Dav Glass this.fire(EV_DROP_EXIT);
998d2791b549446db8394dc80d46a94a247857d9Dav Glass DDM.activeDrag.fire('drag:exit', { drop: this });
998d2791b549446db8394dc80d46a94a247857d9Dav Glass delete DDM.otherDrops[this];
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass //if (DDM.activeDrop === this) {
e20a95dc78bf51b6544e7bfb4e53ed190ecec3c9Dav Glass // DDM.activeDrop = null;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass //}
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass });
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass Y.DD.Drop = Drop;
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass
24e95e1c11b518e1aaaa7f04882febe32de00b5eDav Glass