System.register(['src/client/lively.js', 'src/client/morphic/node-helpers.js', 'src/client/morphic/event-helpers.js', 'src/client/graphics.js', 'src/components/halo/lively-halo-item.js', 'src/client/preferences.js', 'src/client/morphic/snapping.js'], function (_export, _context) {
  "use strict";

  var lively, nodes, events, pt, HaloItem, Preferences, Snapping, Grid;
  return {
    setters: [function (_srcClientLivelyJs) {
      lively = _srcClientLivelyJs.default;
    }, function (_srcClientMorphicNodeHelpersJs) {
      nodes = _srcClientMorphicNodeHelpersJs;
    }, function (_srcClientMorphicEventHelpersJs) {
      events = _srcClientMorphicEventHelpersJs;
    }, function (_srcClientGraphicsJs) {
      pt = _srcClientGraphicsJs.pt;
    }, function (_srcComponentsHaloLivelyHaloItemJs) {
      HaloItem = _srcComponentsHaloLivelyHaloItemJs.default;
    }, function (_srcClientPreferencesJs) {
      Preferences = _srcClientPreferencesJs.default;
    }, function (_srcClientMorphicSnappingJs) {
      Snapping = _srcClientMorphicSnappingJs.default;
      Grid = _srcClientMorphicSnappingJs.Grid;
    }],
    execute: function () {
      const __SystemJSRewritingHack = {};
      _recorder_._src_components_halo_lively_halo_drag_item_js = _recorder_._src_components_halo_lively_halo_drag_item_js || {};
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'lively', {
        get() {
          return lively;
        },

        set(thisIsVererySecretVariableName) {
          lively = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'nodes', {
        get() {
          return nodes;
        },

        set(thisIsVererySecretVariableName) {
          nodes = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'events', {
        get() {
          return events;
        },

        set(thisIsVererySecretVariableName) {
          events = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'pt', {
        get() {
          return pt;
        },

        set(thisIsVererySecretVariableName) {
          pt = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'HaloItem', {
        get() {
          return HaloItem;
        },

        set(thisIsVererySecretVariableName) {
          HaloItem = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'Preferences', {
        get() {
          return Preferences;
        },

        set(thisIsVererySecretVariableName) {
          Preferences = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'Snapping', {
        get() {
          return Snapping;
        },

        set(thisIsVererySecretVariableName) {
          Snapping = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'Grid', {
        get() {
          return Grid;
        },

        set(thisIsVererySecretVariableName) {
          Grid = thisIsVererySecretVariableName;
          return true;
        },

        enumerable: true,
        configurable: true
      });
      class HaloDragItem extends HaloItem {

        initialize() {
          this.startCustomDragging();
        }

        // Drag API
        start(evt) {
          this.dragTarget = window.that;
          if (this.dragTarget) {
            this.dragStartNodePosition = lively.getPosition(this.dragTarget);
            this.dragStartEventPosition = events.globalPosition(evt);
            evt.preventDefault();

            this.snapping = new Snapping(this.dragTarget);
            this.halo.info = lively.showInfoBox(this.dragTarget);

            if (this.dragTarget.haloDragStart) {
              this.dragTarget.haloDragStart(this.dragStartEventPosition);
            }
          }
        }

        move(evt) {
          if (this.dragTarget && !this.isDragging && events.noticableDistanceTo(evt, this.dragStartEventPosition)) {
            // this.dragTarget.style.position = 'absolute';
            this.isDragging = true;
          }
          if (this.isDragging) {
            this.dragTo(evt);
          }
        }

        stop(evt) {
          this.halo.info && this.halo.info.stop
          //  STOP DRAGGING
          ();if (this.isDragging) {
            this.isDragging = false;
            evt.preventDefault();
          }
          this.dragTarget = null;
          this.dragStartEventPosition = null;
          this.dragStartNodePosition = null;
          this.snapping.clearHelpers();
          this.snapping = null;
        }

        dragTo(evt) {
          if (this.dragTarget.haloDragTo) {
            this.dragTarget.haloDragTo(events.globalPosition(evt), this.dragStartEventPosition);
          } else {
            var eventPos = events.globalPosition(evt);
            var newPosition = eventPos.subPt(this.dragStartEventPosition).addPt(this.dragStartNodePosition);

            newPosition = newPosition.rounded();
            if (this.dragTarget.style.position == "absolute") {
              lively.setPosition(this.dragTarget, Grid.optSnapPosition(newPosition, evt));
              if (!evt.altKey) {
                this.snapping.snap();
              }
            } else {
              lively.setPosition(this.dragTarget, newPosition, "relative");
            }
            if (this.halo.info) {
              this.halo.info.innerHTML = "drag " + lively.getPosition(this.dragTarget);
            }
          }
          evt.preventDefault();
        }
      }

      _export('default', HaloDragItem);

      Object.defineProperty(_recorder_._src_components_halo_lively_halo_drag_item_js, 'HaloDragItem', {
        get() {
          return HaloDragItem;
        },

        set(thisIsVererySecretVariableName) {
          _export('default', HaloDragItem = thisIsVererySecretVariableName);

          return true;
        },

        enumerable: true,
        configurable: true
      });
    }
  };
});