function MouseModifier() {}
extendPrototype([ShapeModifier], MouseModifier);
MouseModifier.prototype.processKeys = function (forceRender) {
  if (this.elem.globalData.frameId === this.frameId && !forceRender) {
    return;
  }
  this._mdf = true;
};

MouseModifier.prototype.addShapeToModifier = function () {
  this.positions.push([]);
};

MouseModifier.prototype.processPath = function (path, mouseCoords, positions) {
  var i,
    len = path.v.length;
  var vValues = [],
    oValues = [],
    iValues = [];
  var dist;
  var theta,
    x,
    y;
  /// / OPTION A
  for (i = 0; i < len; i += 1) {
    if (!positions.v[i]) {
      positions.v[i] = [path.v[i][0], path.v[i][1]];
      positions.o[i] = [path.o[i][0], path.o[i][1]];
      positions.i[i] = [path.i[i][0], path.i[i][1]];
      positions.distV[i] = 0;
      positions.distO[i] = 0;
      positions.distI[i] = 0;
    }
    theta = Math.atan2(
      path.v[i][1] - mouseCoords[1],
      path.v[i][0] - mouseCoords[0]
    );

    x = mouseCoords[0] - positions.v[i][0];
    y = mouseCoords[1] - positions.v[i][1];
    var distance = Math.sqrt((x * x) + (y * y));
    positions.distV[i] += (distance - positions.distV[i]) * this.data.dc;

    positions.v[i][0] = (Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distV[i])) / 2 + (path.v[i][0]);
    positions.v[i][1] = (Math.sin(theta) * Math.max(0, this.data.maxDist - positions.distV[i])) / 2 + (path.v[i][1]);

    theta = Math.atan2(
      path.o[i][1] - mouseCoords[1],
      path.o[i][0] - mouseCoords[0]
    );

    x = mouseCoords[0] - positions.o[i][0];
    y = mouseCoords[1] - positions.o[i][1];
    var distance = Math.sqrt((x * x) + (y * y));
    positions.distO[i] += (distance - positions.distO[i]) * this.data.dc;

    positions.o[i][0] = (Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distO[i])) / 2 + (path.o[i][0]);
    positions.o[i][1] = (Math.sin(theta) * Math.max(0, this.data.maxDist - positions.distO[i])) / 2 + (path.o[i][1]);

    theta = Math.atan2(
      path.i[i][1] - mouseCoords[1],
      path.i[i][0] - mouseCoords[0]
    );

    x = mouseCoords[0] - positions.i[i][0];
    y = mouseCoords[1] - positions.i[i][1];
    var distance = Math.sqrt((x * x) + (y * y));
    positions.distI[i] += (distance - positions.distI[i]) * this.data.dc;

    positions.i[i][0] = (Math.cos(theta) * Math.max(0, this.data.maxDist - positions.distI[i])) / 2 + (path.i[i][0]);
    positions.i[i][1] = (Math.sin(theta) * Math.max(0, this.data.maxDist - positions.distI[i])) / 2 + (path.i[i][1]);

    /// //OPTION 1
    vValues.push(positions.v[i]);
    oValues.push(positions.o[i]);
    iValues.push(positions.i[i]);

    /// //OPTION 2
    // vValues.push(positions.v[i]);
    // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]);
    // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]);

    /// //OPTION 3
    // vValues.push(positions.v[i]);
    // iValues.push(path.i[i]);
    // oValues.push(path.o[i]);

    /// //OPTION 4
    // vValues.push(path.v[i]);
    // oValues.push(positions.o[i]);
    // iValues.push(positions.i[i]);
  }

  /// / OPTION B
  /* for(i=0;i<len;i+=1){
        if(!positions.v[i]){
            positions.v[i] = [path.v[i][0],path.v[i][1]];
            positions.o[i] = [path.o[i][0],path.o[i][1]];
            positions.i[i] = [path.i[i][0],path.i[i][1]];
            positions.distV[i] = 0;

        }
        theta = Math.atan2(
            positions.v[i][1] - mouseCoords[1],
            positions.v[i][0] - mouseCoords[0]
        );
        x = mouseCoords[0] - positions.v[i][0];
        y = mouseCoords[1] - positions.v[i][1];
        var distance = this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );

        positions.v[i][0] += Math.cos(theta) * distance + (path.v[i][0] - positions.v[i][0]) * this.data.dc;
        positions.v[i][1] += Math.sin(theta) * distance + (path.v[i][1] - positions.v[i][1]) * this.data.dc;

        theta = Math.atan2(
            positions.o[i][1] - mouseCoords[1],
            positions.o[i][0] - mouseCoords[0]
        );
        x = mouseCoords[0] - positions.o[i][0];
        y = mouseCoords[1] - positions.o[i][1];
        var distance =  this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );

        positions.o[i][0] += Math.cos(theta) * distance + (path.o[i][0] - positions.o[i][0]) * this.data.dc;
        positions.o[i][1] += Math.sin(theta) * distance + (path.o[i][1] - positions.o[i][1]) * this.data.dc;

        theta = Math.atan2(
            positions.i[i][1] - mouseCoords[1],
            positions.i[i][0] - mouseCoords[0]
        );
        x = mouseCoords[0] - positions.i[i][0];
        y = mouseCoords[1] - positions.i[i][1];
        var distance =  this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) );

        positions.i[i][0] += Math.cos(theta) * distance + (path.i[i][0] - positions.i[i][0]) * this.data.dc;
        positions.i[i][1] += Math.sin(theta) * distance + (path.i[i][1] - positions.i[i][1]) * this.data.dc;

        /////OPTION 1
        //vValues.push(positions.v[i]);
        // oValues.push(positions.o[i]);
        // iValues.push(positions.i[i]);

        /////OPTION 2
        //vValues.push(positions.v[i]);
        // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]);
        // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]);

        /////OPTION 3
        //vValues.push(positions.v[i]);
        //iValues.push(path.i[i]);
        //oValues.push(path.o[i]);

        /////OPTION 4
        //vValues.push(path.v[i]);
        // oValues.push(positions.o[i]);
        // iValues.push(positions.i[i]);
    } */

  return {
    v: vValues,
    o: oValues,
    i: iValues,
    c: path.c,
  };
};

MouseModifier.prototype.processShapes = function () {
  var mouseX = this.elem.globalData.mouseX;
  var mouseY = this.elem.globalData.mouseY;
  var shapePaths;
  var i,
    len = this.shapes.length;
  var j,
    jLen;

  if (mouseX) {
    var localMouseCoords = this.elem.globalToLocal([mouseX, mouseY, 0]);

    var shapeData,
      newPaths = [];
    for (i = 0; i < len; i += 1) {
      shapeData = this.shapes[i];
      if (!shapeData.shape._mdf && !this._mdf) {
        shapeData.shape.paths = shapeData.last;
      } else {
        shapeData.shape._mdf = true;
        shapePaths = shapeData.shape.paths;
        jLen = shapePaths.length;
        for (j = 0; j < jLen; j += 1) {
          if (!this.positions[i][j]) {
            this.positions[i][j] = {
              v: [],
              o: [],
              i: [],
              distV: [],
              distO: [],
              distI: [],
            };
          }
          newPaths.push(this.processPath(shapePaths[j], localMouseCoords, this.positions[i][j]));
        }
        shapeData.shape.paths = newPaths;
        shapeData.last = newPaths;
      }
    }
  }
};

MouseModifier.prototype.initModifierProperties = function (elem, data) {
  this.getValue = this.processKeys;
  this.data = data;
  this.positions = [];
};

ShapeModifiers.registerModifier('ms', MouseModifier);
