(function () {
  /**
   * RGB Filter
   * @function
   * @memberof Kinetic.Filters
   * @param {Object} imageData
   * @author ippo615
   */
  Kinetic.Filters.RGB = function (imageData) {
    var data = imageData.data,
        nPixels = data.length,
        red = this.red(),
        green = this.green(),
        blue = this.blue(),
        i, brightness;

    for (i = 0; i < nPixels; i += 4) {
      brightness = (0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2])/255;
      data[i    ] = brightness*red; // r
      data[i + 1] = brightness*green; // g
      data[i + 2] = brightness*blue; // b
      data[i + 3] = data[i + 3]; // alpha
    }
  };

  Kinetic.Factory.addGetterSetter(Kinetic.Node, 'red', 0, function(val) {
      this._filterUpToDate = false;
      if (val > 255) {
          return 255;
      }
      else if (val < 0) {
          return 0;
      }
      else {
          return Math.round(val);
      }
  });
  /**
  * get/set filter red value
  * @name red
  * @method
  * @memberof Kinetic.Node.prototype
  * @param {Integer} red value between 0 and 255
  * @returns {Integer}
  */

  Kinetic.Factory.addGetterSetter(Kinetic.Node, 'green', 0, function(val) {
      this._filterUpToDate = false;
      if (val > 255) {
          return 255;
      }
      else if (val < 0) {
          return 0;
      }
      else {
          return Math.round(val);
      }
  });
  /**
  * get/set filter green value
  * @name green
  * @method
  * @memberof Kinetic.Node.prototype
  * @param {Integer} green value between 0 and 255
  * @returns {Integer}
  */

  Kinetic.Factory.addGetterSetter(Kinetic.Node, 'blue', 0, Kinetic.Validators.RGBComponent, Kinetic.Factory.afterSetFilter);
  /**
  * get/set filter blue value
  * @name blue
  * @method
  * @memberof Kinetic.Node.prototype
  * @param {Integer} blue value between 0 and 255
  * @returns {Integer}
  */
})();
