/** gridstack.js 0.6.4 - JQuery UI Drag&Drop plugin @preserve */
/**
 * https://gridstackjs.com/
 * (c) 2014-2020 Alain Dumesny, Dylan Weiss, Pavel Reznikov
 * gridstack.js may be freely distributed under the MIT license.
*/
(function(factory) {
  if (typeof define === 'function' && define.amd) {
    define(['jquery', 'gridstack', 'exports'], factory);
  } else if (typeof exports !== 'undefined') {
    try { jQuery = require('jquery'); } catch (e) {}
    try { gridstack = require('gridstack'); } catch (e) {}
    factory(jQuery, gridstack.GridStackUI, exports);
  } else {
    factory(jQuery, GridStackUI, window);
  }
})(function($, GridStackUI, scope) {
  /**
  * @class JQueryUIGridStackDragDropPlugin
  * jQuery UI implementation of drag'n'drop gridstack plugin.
  */
  function JQueryUIGridStackDragDropPlugin(grid) {
    GridStackUI.GridStackDragDropPlugin.call(this, grid);
  }

  GridStackUI.GridStackDragDropPlugin.registerPlugin(JQueryUIGridStackDragDropPlugin);

  JQueryUIGridStackDragDropPlugin.prototype = Object.create(GridStackUI.GridStackDragDropPlugin.prototype);
  JQueryUIGridStackDragDropPlugin.prototype.constructor = JQueryUIGridStackDragDropPlugin;

  JQueryUIGridStackDragDropPlugin.prototype.resizable = function(el, opts) {
    el = $(el);
    if (opts === 'disable' || opts === 'enable') {
      el.resizable(opts);
    } else if (opts === 'option') {
      var key = arguments[2];
      var value = arguments[3];
      el.resizable(opts, key, value);
    } else {
      var handles = el.data('gs-resize-handles') ? el.data('gs-resize-handles') :
        this.grid.opts.resizable.handles;
      el.resizable($.extend({}, this.grid.opts.resizable, {
        handles: handles
      }, {
        start: opts.start || function() {},
        stop: opts.stop || function() {},
        resize: opts.resize || function() {}
      }));
    }
    return this;
  };

  JQueryUIGridStackDragDropPlugin.prototype.draggable = function(el, opts) {
    el = $(el);
    if (opts === 'disable' || opts === 'enable') {
      el.draggable(opts);
    } else {
      el.draggable($.extend({}, this.grid.opts.draggable, {
        containment: (this.grid.opts.isNested && !this.grid.opts.dragOut) ?
          this.grid.container.parent() :
          (this.grid.opts.draggable.containment || null),
        start: opts.start || function() {},
        stop: opts.stop || function() {},
        drag: opts.drag || function() {}
      }));
    }
    return this;
  };

  JQueryUIGridStackDragDropPlugin.prototype.droppable = function(el, opts) {
    el = $(el);
    el.droppable(opts);
    return this;
  };

  JQueryUIGridStackDragDropPlugin.prototype.isDroppable = function(el, opts) {
    el = $(el);
    return Boolean(el.data('droppable'));
  };

  JQueryUIGridStackDragDropPlugin.prototype.on = function(el, eventName, callback) {
    $(el).on(eventName, callback);
    return this;
  };

  scope.JQueryUIGridStackDragDropPlugin = JQueryUIGridStackDragDropPlugin;

  return JQueryUIGridStackDragDropPlugin;
});
