text: /*
   * @class TileLayer.WMS
   * @inherits TileLayer
   * @aka L.TileLayer.WMS
   * Used to display [WMS](https://en.wikipedia.org/wiki/Web_Map_Service) services as tile layers on the map. Extends `TileLayer`.
   *
   * @example
   *
   * ```js
   * var nexrad = L.tileLayer.wms("http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi", {
   * 	layers: 'nexrad-n0r-900913',
   * 	format: 'image/png',
   * 	transparent: true,
   * 	attribution: "Weather data © 2012 IEM Nexrad"
   * });
   * ```
   */
  
  L.TileLayer.WMS = L.TileLayer.extend({
  
  	// @section
  	// @aka TileLayer.WMS options
  	// If any custom options not documented here are used, they will be sent to the
  	// WMS server as extra parameters in each request URL. This can be useful for
  	// [non-standard vendor WMS parameters](http://docs.geoserver.org/stable/en/user/services/wms/vendor.html).
  	defaultWmsParams: {
  		service: 'WMS',
  		request: 'GetMap',
  
  		// @option layers: String = ''
  		// **(required)** Comma-separated list of WMS layers to show.
  		layers: '',
  
  		// @option styles: String = ''
  		// Comma-separated list of WMS styles.
  		styles: '',
  
  		// @option format: String = 'image/jpeg'
  		// WMS image format (use `'image/png'` for layers with transparency).
  		format: 'image/jpeg',
  
  		// @option transparent: Boolean = false
  		// If `true`, the WMS service will return images with transparency.
  		transparent: false,
  
  		// @option version: String = '1.1.1'
  		// Version of the WMS service to use
  		version: '1.1.1'
  	},
  
  	options: {
  		// @option crs: CRS = null
  		// Coordinate Reference System to use for the WMS requests, defaults to
  		// map CRS. Don't change this if you're not sure what it means.
  		crs: null,
  
  		// @option uppercase: Boolean = false
  		// If `true`, WMS request parameter keys will be uppercase.
  		uppercase: false
  	},
  
  	initialize: function (url, options) {
  
  		this._url = url;
  
  		var wmsParams = L.extend({}, this.defaultWmsParams);
  
  		// all keys that are not TileLayer options go to WMS params
  		for (var i in options) {
  			if (!(i in this.options)) {
  				wmsParams[i] = options[i];
  			}
  		}
  
  		options = L.setOptions(this, options);
  
  		wmsParams.width = wmsParams.height = options.tileSize * (options.detectRetina && L.Browser.retina ? 2 : 1);
  
  		this.wmsParams = wmsParams;
  	},
  
  	onAdd: function (map) {
  
  		this._crs = this.options.crs || map.options.crs;
  		this._wmsVersion = parseFloat(this.wmsParams.version);
  
  		var projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';
  		this.wmsParams[projectionKey] = this._crs.code;
  
  		L.TileLayer.prototype.onAdd.call(this, map);
  	},
  
  	getTileUrl: function (coords) {
  
  		var tileBounds = this._tileCoordsToBounds(coords),
  		    nw = this._crs.project(tileBounds.getNorthWest()),
  		    se = this._crs.project(tileBounds.getSouthEast()),
  
  		    bbox = (this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?
  			    [se.y, nw.x, nw.y, se.x] :
  			    [nw.x, se.y, se.x, nw.y]).join(','),
  
  		    url = L.TileLayer.prototype.getTileUrl.call(this, coords);
  
  		return url +
  			L.Util.getParamString(this.wmsParams, url, this.options.uppercase) +
  			(this.options.uppercase ? '&BBOX=' : '&bbox=') + bbox;
  	},
  
  	// @method setParams(params: Object, noRedraw?: Boolean): this
  	// Merges an object with the new parameters and re-requests tiles on the current screen (unless `noRedraw` was set to true).
  	setParams: function (params, noRedraw) {
  
  		L.extend(this.wmsParams, params);
  
  		if (!noRedraw) {
  			this.redraw();
  		}
  
  		return this;
  	}
  });
  
  
  // @factory L.tileLayer.wms(baseUrl: String, options: TileLayer.WMS options)
  // Instantiates a WMS tile layer object given a base URL of the WMS service and a WMS parameters/options object.
  L.tileLayer.wms = function (url, options) {
  	return new L.TileLayer.WMS(url, options);
  };
  