var bezier = (function() { return function() {
  var ret = {
    points : [],
    point : function(x,y) {
      return {x:x,y:y};
    },
    addPoint : function(point) {
      this.points.push(point);
    },
    getPoint : function(t) {
      if (t < 0 || t > 1) {
        alert("bezier::getPoint t must be between 0 and 1");
        return false;
      }
      if (this.points.length < 2) {
        alert("bezier::getPoint must have at least 2 points");
        return false;
      }
      var points = this.points;
      var new_points = [];
      var x;
      while (points.length > 1) {
        for (x=points.length-1; x>0; x--) {
          new_points[x-1] = this.getWayPoint(points[x-1], points[x], t);
        }
        points = new_points;
        new_points = [];
      }
      return points[0];
    },
    getWayPoint : function(p1, p2, t) {
      var x = p1.x - ((p1.x - p2.x) * t);
      var y = p1.y - ((p1.y - p2.y) * t);
      return this.point(x,y);
    }
  };
  return ret;
}})();