text: goog.provide('ol.format.ogc.filter');
  goog.provide('ol.format.ogc.filter.Filter');
  goog.provide('ol.format.ogc.filter.Logical');
  goog.provide('ol.format.ogc.filter.LogicalBinary');
  goog.provide('ol.format.ogc.filter.And');
  goog.provide('ol.format.ogc.filter.Or');
  goog.provide('ol.format.ogc.filter.Not');
  goog.provide('ol.format.ogc.filter.Bbox');
  goog.provide('ol.format.ogc.filter.Comparison');
  goog.provide('ol.format.ogc.filter.ComparisonBinary');
  goog.provide('ol.format.ogc.filter.EqualTo');
  goog.provide('ol.format.ogc.filter.NotEqualTo');
  goog.provide('ol.format.ogc.filter.LessThan');
  goog.provide('ol.format.ogc.filter.LessThanOrEqualTo');
  goog.provide('ol.format.ogc.filter.GreaterThan');
  goog.provide('ol.format.ogc.filter.GreaterThanOrEqualTo');
  goog.provide('ol.format.ogc.filter.IsNull');
  goog.provide('ol.format.ogc.filter.IsBetween');
  goog.provide('ol.format.ogc.filter.IsLike');
  
  
  /**
   * Create a logical `<And>` operator between two filter conditions.
   *
   * @param {!ol.format.ogc.filter.Filter} conditionA First filter condition.
   * @param {!ol.format.ogc.filter.Filter} conditionB Second filter condition.
   * @returns {!ol.format.ogc.filter.And} `<And>` operator.
   * @api
   */
  ol.format.ogc.filter.and = function(conditionA, conditionB) {
    return new ol.format.ogc.filter.And(conditionA, conditionB);
  };
  
  
  /**
   * Create a logical `<Or>` operator between two filter conditions.
   *
   * @param {!ol.format.ogc.filter.Filter} conditionA First filter condition.
   * @param {!ol.format.ogc.filter.Filter} conditionB Second filter condition.
   * @returns {!ol.format.ogc.filter.Or} `<Or>` operator.
   * @api
   */
  ol.format.ogc.filter.or = function(conditionA, conditionB) {
    return new ol.format.ogc.filter.Or(conditionA, conditionB);
  };
  
  
  /**
   * Represents a logical `<Not>` operator for a filter condition.
   *
   * @param {!ol.format.ogc.filter.Filter} condition Filter condition.
   * @returns {!ol.format.ogc.filter.Not} `<Not>` operator.
   * @api
   */
  ol.format.ogc.filter.not = function(condition) {
    return new ol.format.ogc.filter.Not(condition);
  };
  
  
  /**
   * Create a `<BBOX>` operator to test whether a geometry-valued property
   * intersects a fixed bounding box
   *
   * @param {!string} geometryName Geometry name to use.
   * @param {!ol.Extent} extent Extent.
   * @param {string=} opt_srsName SRS name. No srsName attribute will be
   *    set on geometries when this is not provided.
   * @returns {!ol.format.ogc.filter.Bbox} `<BBOX>` operator.
   * @api
   */
  ol.format.ogc.filter.bbox = function(geometryName, extent, opt_srsName) {
    return new ol.format.ogc.filter.Bbox(geometryName, extent, opt_srsName);
  };
  
  
  /**
   * Creates a `<PropertyIsEqualTo>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!(string|number)} expression The value to compare.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @returns {!ol.format.ogc.filter.EqualTo} `<PropertyIsEqualTo>` operator.
   * @api
   */
  ol.format.ogc.filter.equalTo = function(propertyName, expression, opt_matchCase) {
    return new ol.format.ogc.filter.EqualTo(propertyName, expression, opt_matchCase);
  };
  
  
  /**
   * Creates a `<PropertyIsNotEqualTo>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!(string|number)} expression The value to compare.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @returns {!ol.format.ogc.filter.NotEqualTo} `<PropertyIsNotEqualTo>` operator.
   * @api
   */
  ol.format.ogc.filter.notEqualTo = function(propertyName, expression, opt_matchCase) {
    return new ol.format.ogc.filter.NotEqualTo(propertyName, expression, opt_matchCase);
  };
  
  
  /**
   * Creates a `<PropertyIsLessThan>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @returns {!ol.format.ogc.filter.LessThan} `<PropertyIsLessThan>` operator.
   * @api
   */
  ol.format.ogc.filter.lessThan = function(propertyName, expression) {
    return new ol.format.ogc.filter.LessThan(propertyName, expression);
  };
  
  
  /**
   * Creates a `<PropertyIsLessThanOrEqualTo>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @returns {!ol.format.ogc.filter.LessThanOrEqualTo} `<PropertyIsLessThanOrEqualTo>` operator.
   * @api
   */
  ol.format.ogc.filter.lessThanOrEqualTo = function(propertyName, expression) {
    return new ol.format.ogc.filter.LessThanOrEqualTo(propertyName, expression);
  };
  
  
  /**
   * Creates a `<PropertyIsGreaterThan>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @returns {!ol.format.ogc.filter.GreaterThan} `<PropertyIsGreaterThan>` operator.
   * @api
   */
  ol.format.ogc.filter.greaterThan = function(propertyName, expression) {
    return new ol.format.ogc.filter.GreaterThan(propertyName, expression);
  };
  
  
  /**
   * Creates a `<PropertyIsGreaterThanOrEqualTo>` comparison operator.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @returns {!ol.format.ogc.filter.GreaterThanOrEqualTo} `<PropertyIsGreaterThanOrEqualTo>` operator.
   * @api
   */
  ol.format.ogc.filter.greaterThanOrEqualTo = function(propertyName, expression) {
    return new ol.format.ogc.filter.GreaterThanOrEqualTo(propertyName, expression);
  };
  
  
  /**
   * Creates a `<PropertyIsNull>` comparison operator to test whether a property value
   * is null.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @returns {!ol.format.ogc.filter.IsNull} `<PropertyIsNull>` operator.
   * @api
   */
  ol.format.ogc.filter.isNull = function(propertyName) {
    return new ol.format.ogc.filter.IsNull(propertyName);
  };
  
  
  /**
   * Creates a `<PropertyIsBetween>` comparison operator to test whether an expression
   * value lies within a range given by a lower and upper bound (inclusive).
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} lowerBoundary The lower bound of the range.
   * @param {!number} upperBoundary The upper bound of the range.
   * @returns {!ol.format.ogc.filter.IsBetween} `<PropertyIsBetween>` operator.
   * @api
   */
  ol.format.ogc.filter.between = function(propertyName, lowerBoundary, upperBoundary) {
    return new ol.format.ogc.filter.IsBetween(propertyName, lowerBoundary, upperBoundary);
  };
  
  
  /**
   * Represents a `<PropertyIsLike>` comparison operator that matches a string property
   * value against a text pattern.
   *
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!string} pattern Text pattern.
   * @param {string=} opt_wildCard Pattern character which matches any sequence of
   *    zero or more string characters. Default is '*'.
   * @param {string=} opt_singleChar pattern character which matches any single
   *    string character. Default is '.'.
   * @param {string=} opt_escapeChar Escape character which can be used to escape
   *    the pattern characters. Default is '!'.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @returns {!ol.format.ogc.filter.IsLike} `<PropertyIsLike>` operator.
   * @api
   */
  ol.format.ogc.filter.like = function(propertyName, pattern,
      opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase) {
    return new ol.format.ogc.filter.IsLike(propertyName, pattern,
      opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase);
  };
  
  
  /**
   * @classdesc
   * Abstract class; normally only used for creating subclasses and not instantiated in apps.
   * Base class for WFS GetFeature filters.
   *
   * @constructor
   * @param {!string} tagName The XML tag name for this filter.
   * @struct
   * @api
   */
  ol.format.ogc.filter.Filter = function(tagName) {
  
    /**
     * @private
     * @type {!string}
     */
    this.tagName_ = tagName;
  };
  
  /**
   * The XML tag name for a filter.
   * @returns {!string} Name.
   */
  ol.format.ogc.filter.Filter.prototype.getTagName = function() {
    return this.tagName_;
  };
  
  
  // Logical filters
  
  
  /**
   * @classdesc
   * Abstract class; normally only used for creating subclasses and not instantiated in apps.
   * Base class for WFS GetFeature logical filters.
   *
   * @constructor
   * @param {!string} tagName The XML tag name for this filter.
   * @extends {ol.format.ogc.filter.Filter}
   */
  ol.format.ogc.filter.Logical = function(tagName) {
    ol.format.ogc.filter.Filter.call(this, tagName);
  };
  ol.inherits(ol.format.ogc.filter.Logical, ol.format.ogc.filter.Filter);
  
  
  /**
   * @classdesc
   * Abstract class; normally only used for creating subclasses and not instantiated in apps.
   * Base class for WFS GetFeature binary logical filters.
   *
   * @constructor
   * @param {!string} tagName The XML tag name for this filter.
   * @param {!ol.format.ogc.filter.Filter} conditionA First filter condition.
   * @param {!ol.format.ogc.filter.Filter} conditionB Second filter condition.
   * @extends {ol.format.ogc.filter.Logical}
   */
  ol.format.ogc.filter.LogicalBinary = function(tagName, conditionA, conditionB) {
  
    ol.format.ogc.filter.Logical.call(this, tagName);
  
    /**
     * @public
     * @type {!ol.format.ogc.filter.Filter}
     */
    this.conditionA = conditionA;
  
    /**
     * @public
     * @type {!ol.format.ogc.filter.Filter}
     */
    this.conditionB = conditionB;
  
  };
  ol.inherits(ol.format.ogc.filter.LogicalBinary, ol.format.ogc.filter.Logical);
  
  
  /**
   * @classdesc
   * Represents a logical `<And>` operator between two filter conditions.
   *
   * @constructor
   * @param {!ol.format.ogc.filter.Filter} conditionA First filter condition.
   * @param {!ol.format.ogc.filter.Filter} conditionB Second filter condition.
   * @extends {ol.format.ogc.filter.LogicalBinary}
   * @api
   */
  ol.format.ogc.filter.And = function(conditionA, conditionB) {
    ol.format.ogc.filter.LogicalBinary.call(this, 'And', conditionA, conditionB);
  };
  ol.inherits(ol.format.ogc.filter.And, ol.format.ogc.filter.LogicalBinary);
  
  
  /**
   * @classdesc
   * Represents a logical `<Or>` operator between two filter conditions.
   *
   * @constructor
   * @param {!ol.format.ogc.filter.Filter} conditionA First filter condition.
   * @param {!ol.format.ogc.filter.Filter} conditionB Second filter condition.
   * @extends {ol.format.ogc.filter.LogicalBinary}
   * @api
   */
  ol.format.ogc.filter.Or = function(conditionA, conditionB) {
    ol.format.ogc.filter.LogicalBinary.call(this, 'Or', conditionA, conditionB);
  };
  ol.inherits(ol.format.ogc.filter.Or, ol.format.ogc.filter.LogicalBinary);
  
  
  /**
   * @classdesc
   * Represents a logical `<Not>` operator for a filter condition.
   *
   * @constructor
   * @param {!ol.format.ogc.filter.Filter} condition Filter condition.
   * @extends {ol.format.ogc.filter.Logical}
   * @api
   */
  ol.format.ogc.filter.Not = function(condition) {
  
    ol.format.ogc.filter.Logical.call(this, 'Not');
  
    /**
     * @public
     * @type {!ol.format.ogc.filter.Filter}
     */
    this.condition = condition;
  };
  ol.inherits(ol.format.ogc.filter.Not, ol.format.ogc.filter.Logical);
  
  
  // Spatial filters
  
  
  /**
   * @classdesc
   * Represents a `<BBOX>` operator to test whether a geometry-valued property
   * intersects a fixed bounding box
   *
   * @constructor
   * @param {!string} geometryName Geometry name to use.
   * @param {!ol.Extent} extent Extent.
   * @param {string=} opt_srsName SRS name. No srsName attribute will be
   *    set on geometries when this is not provided.
   * @extends {ol.format.ogc.filter.Filter}
   * @api
   */
  ol.format.ogc.filter.Bbox = function(geometryName, extent, opt_srsName) {
  
    ol.format.ogc.filter.Filter.call(this, 'BBOX');
  
    /**
     * @public
     * @type {!string}
     */
    this.geometryName = geometryName;
  
    /**
     * @public
     * @type {ol.Extent}
     */
    this.extent = extent;
  
    /**
     * @public
     * @type {string|undefined}
     */
    this.srsName = opt_srsName;
  };
  ol.inherits(ol.format.ogc.filter.Bbox, ol.format.ogc.filter.Filter);
  
  
  // Property comparison filters
  
  
  /**
   * @classdesc
   * Abstract class; normally only used for creating subclasses and not instantiated in apps.
   * Base class for WFS GetFeature property comparison filters.
   *
   * @constructor
   * @param {!string} tagName The XML tag name for this filter.
   * @param {!string} propertyName Name of the context property to compare.
   * @extends {ol.format.ogc.filter.Filter}
   * @api
   */
  ol.format.ogc.filter.Comparison = function(tagName, propertyName) {
  
    ol.format.ogc.filter.Filter.call(this, tagName);
  
    /**
     * @public
     * @type {!string}
     */
    this.propertyName = propertyName;
  };
  ol.inherits(ol.format.ogc.filter.Comparison, ol.format.ogc.filter.Filter);
  
  
  /**
   * @classdesc
   * Abstract class; normally only used for creating subclasses and not instantiated in apps.
   * Base class for WFS GetFeature property binary comparison filters.
   *
   * @constructor
   * @param {!string} tagName The XML tag name for this filter.
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!(string|number)} expression The value to compare.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @extends {ol.format.ogc.filter.Comparison}
   * @api
   */
  ol.format.ogc.filter.ComparisonBinary = function(
      tagName, propertyName, expression, opt_matchCase) {
  
    ol.format.ogc.filter.Comparison.call(this, tagName, propertyName);
  
    /**
     * @public
     * @type {!(string|number)}
     */
    this.expression = expression;
  
    /**
     * @public
     * @type {boolean|undefined}
     */
    this.matchCase = opt_matchCase;
  };
  ol.inherits(ol.format.ogc.filter.ComparisonBinary, ol.format.ogc.filter.Comparison);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsEqualTo>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!(string|number)} expression The value to compare.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.EqualTo = function(propertyName, expression, opt_matchCase) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsEqualTo', propertyName, expression, opt_matchCase);
  };
  ol.inherits(ol.format.ogc.filter.EqualTo, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsNotEqualTo>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!(string|number)} expression The value to compare.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.NotEqualTo = function(propertyName, expression, opt_matchCase) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsNotEqualTo', propertyName, expression, opt_matchCase);
  };
  ol.inherits(ol.format.ogc.filter.NotEqualTo, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsLessThan>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.LessThan = function(propertyName, expression) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsLessThan', propertyName, expression);
  };
  ol.inherits(ol.format.ogc.filter.LessThan, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsLessThanOrEqualTo>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.LessThanOrEqualTo = function(propertyName, expression) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsLessThanOrEqualTo', propertyName, expression);
  };
  ol.inherits(ol.format.ogc.filter.LessThanOrEqualTo, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsGreaterThan>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.GreaterThan = function(propertyName, expression) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsGreaterThan', propertyName, expression);
  };
  ol.inherits(ol.format.ogc.filter.GreaterThan, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsGreaterThanOrEqualTo>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} expression The value to compare.
   * @extends {ol.format.ogc.filter.ComparisonBinary}
   * @api
   */
  ol.format.ogc.filter.GreaterThanOrEqualTo = function(propertyName, expression) {
    ol.format.ogc.filter.ComparisonBinary.call(this, 'PropertyIsGreaterThanOrEqualTo', propertyName, expression);
  };
  ol.inherits(ol.format.ogc.filter.GreaterThanOrEqualTo, ol.format.ogc.filter.ComparisonBinary);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsNull>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @extends {ol.format.ogc.filter.Comparison}
   * @api
   */
  ol.format.ogc.filter.IsNull = function(propertyName) {
    ol.format.ogc.filter.Comparison.call(this, 'PropertyIsNull', propertyName);
  };
  ol.inherits(ol.format.ogc.filter.IsNull, ol.format.ogc.filter.Comparison);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsBetween>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!number} lowerBoundary The lower bound of the range.
   * @param {!number} upperBoundary The upper bound of the range.
   * @extends {ol.format.ogc.filter.Comparison}
   * @api
   */
  ol.format.ogc.filter.IsBetween = function(propertyName, lowerBoundary, upperBoundary) {
    ol.format.ogc.filter.Comparison.call(this, 'PropertyIsBetween', propertyName);
  
    /**
     * @public
     * @type {!number}
     */
    this.lowerBoundary = lowerBoundary;
  
    /**
     * @public
     * @type {!number}
     */
    this.upperBoundary = upperBoundary;
  };
  ol.inherits(ol.format.ogc.filter.IsBetween, ol.format.ogc.filter.Comparison);
  
  
  /**
   * @classdesc
   * Represents a `<PropertyIsLike>` comparison operator.
   *
   * @constructor
   * @param {!string} propertyName Name of the context property to compare.
   * @param {!string} pattern Text pattern.
   * @param {string=} opt_wildCard Pattern character which matches any sequence of
   *    zero or more string characters. Default is '*'.
   * @param {string=} opt_singleChar pattern character which matches any single
   *    string character. Default is '.'.
   * @param {string=} opt_escapeChar Escape character which can be used to escape
   *    the pattern characters. Default is '!'.
   * @param {boolean=} opt_matchCase Case-sensitive?
   * @extends {ol.format.ogc.filter.Comparison}
   * @api
   */
  ol.format.ogc.filter.IsLike = function(propertyName, pattern,
      opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase) {
    ol.format.ogc.filter.Comparison.call(this, 'PropertyIsLike', propertyName);
  
    /**
     * @public
     * @type {!string}
     */
    this.pattern = pattern;
  
    /**
     * @public
     * @type {!string}
     */
    this.wildCard = (opt_wildCard !== undefined) ? opt_wildCard : '*';
  
    /**
     * @public
     * @type {!string}
     */
    this.singleChar = (opt_singleChar !== undefined) ? opt_singleChar : '.';
  
    /**
     * @public
     * @type {!string}
     */
    this.escapeChar = (opt_escapeChar !== undefined) ? opt_escapeChar : '!';
  
    /**
     * @public
     * @type {boolean|undefined}
     */
    this.matchCase = opt_matchCase;
  };
  ol.inherits(ol.format.ogc.filter.IsLike, ol.format.ogc.filter.Comparison);
  