text: const Motion = require("../motion");
  const Vector = require("../tools/vector");
  const PhSim = require("../index");
  
  // Try to import matter-js as a commonJS module
  
  var Matter;
  
  if(typeof window === "object") {
  	Matter = window.Matter;
  }
  
  else {
  	Matter = require("matter-js");
  }
  /**
   * 
   * The `elevator` widget makes objects go back and forth within some range.
   * 
   * @function
   * @param {PhSim.DynObject} dyn_object 
   * @param {Object} widget - Options
   * @param {Vector} widget.pointA - First point of the elevator
   * @param {Vector} widget.pointB - Second point of the elevator
   * @param {"x"|"y"} widget.bounding - Rules for deteriming the range of the elevator. 
   * 
   * If `widget.bounding` is equal to `"x"`, then the elevator switches direction if the
   * `x` value of the position of `dyn_object` is equal to `widget.pointA.x` or `widget.pointB.x`.
   * 
   * If `widget.bounding` is equal to `"y"`, then the elevator switches direction if the
   * `y` value of the position of `dyn_object` is equal to `widget.pointA.y` or `widget.pointB.y`.
   * 
   */
  
  PhSim.Widgets.elevator = function(dyn_object,widget) {
              
      var func = function() {
      
          var bounding = widget.bounding;
  
          var obj = dyn_object;
          var relVec = Vector.subtract(widget.pointB,widget.pointA);
          
          var u = Vector.unitVector(relVec);
          
          var ax;
          var ay;
          var bx;
          var by;
          
          // Corrections
          
          var reversable = true;
          
          // Condition function for checking if object is in bounds
          
          var cond_f = function() {}
          
          if(bounding === "x") {
  
              if(widget.pointA.x < widget.pointB.x) {
                  ax = widget.pointA.x;
                  bx = widget.pointB.x;
              }
              
              if(widget.pointB.x < widget.pointA.x) {
                 ax = widget.pointB.x;
                 bx = widget.pointA.x;
              }
          
              cond_f = function() {
                  return (ax <= obj.matter.position.x) && (obj.matter.position.x <= bx);
              }
          
          }
          
          if(bounding === "y") {
  
              if(widget.pointA.y < widget.pointB.y) {
                  ay = widget.pointA.y;
                  by = widget.pointB.y;
              }
              
              if(widget.pointB.y < widget.pointA.y) {
                 ay = widget.pointB.y;
                 by = widget.pointA.y;
              }
          
              cond_f = function() {
                  return (ay <= obj.matter.position.y) && (obj.matter.position.y <= by);
              }
          
          }
          
          // Set body static
          
          Matter.Body.setStatic(dyn_object.matter,true);
          
          // Event function
  
          var inRange = function() {
  
          if( cond_f() ) {
          Motion.translate(obj,Vector.scale(u,1));
                  reversable = true;
          }
            
              else {
              
                  if(reversable) {
  
                      u = {
                          "x": -u.x,
                          "y": -u.y
                      }
  
                      reversable = false;
                  }
  
                  else {
                      Motion.translate(obj,Vector.scale(u,1));
                  }
              
              }
              
  
          }
  
          return inRange
  
  
      }
  
      this.on("afterupdate",func());
  
  }