function Brush()
{
  Module.call(this);
  
  this.pointers = [new Pointer(new Position())];
  
  this.position = new Position();
  this.is_drawing = false;
  this.size = 1;
  this.opacity = 1;
  this.color = new Color();
  
  // Module
  
  this.active = function(cmd)
  {
    if(cmd.bang()){ this.pointers = []; }
    
    var pointer = new Pointer();
    
    if(cmd.position()){
      pointer.offset = cmd.position();
    }
    if(cmd.rect()){
      pointer.mirror = cmd.rect();
    }
    if(cmd.noise()){
      pointer.noise = cmd.noise();
    }
    if(cmd.angle()){
      pointer.angle = cmd.angle();
    }
    if(cmd.rect() || cmd.position() || cmd.noise() || cmd.angle()){
      this.add_pointer(pointer);
    }
    if(cmd.color()){
      this.color = cmd.color();
    }
    if(cmd.value()){
      this.size = cmd.value();
    }
  }
  
  this.passive = function(cmd)
  {
  }
  
  this.hint = function(cmd)
  {
    if(cmd.bang()){ return "Brush: Erase all pointers"; }
    
    var hint_value = (cmd.value() ? "Size "+cmd.value()+" " : "");
    var hint_position = (cmd.position() ? "Position "+cmd.position().x+","+cmd.position().y+" " : "");
    var hint_color = (cmd.color() ? "Color "+cmd.color().hex+" " : "");
    var hint_rect = (cmd.rect() ? "Mirror "+cmd.rect().width+"/"+cmd.rect().height+" " : "");
    var hint_noise = (cmd.noise() ? "Noise 0.."+cmd.noise()+" " : "");
    
    return "Brush: "+hint_value+hint_position+hint_color+hint_rect+hint_noise;
  }
  
  this.add_pointer = function(pointer)
  {
    this.pointers.push(pointer);
  }
  
  // Draw
  
  this.draw = function(e)
  {
    if(this.is_drawing === false){return;}
    
    this.position = new Position(e.clientX,e.clientY);
    
    for (i = 0; i < this.pointers.length; i++) {
      this.pointers[i].draw();
    }
  }
  
  this.draw_start = function(e)
  {
    this.is_drawing = true;
    
    for (i = 0; i < this.pointers.length; i++) {
      this.pointers[i].start();
    }
  }
  
  this.draw_stop = function(e)
  {
    this.is_drawing = false;
    
    for (i = 0; i < this.pointers.length; i++) {
      this.pointers[i].stop();
    }
  }
  
}