﻿/*
* The original implementation of the WMSGetFeatureInfo does not support layer filters.
* This prototype method does. It is a copy of the original with code inserted various places.
**/
OpenLayers.Control.WMSGetFeatureInfo.prototype.buildWMSOptions = function(url, layers, clickPosition, format) {
    var layerNames = [], styleNames = [];
	// LE34:Begin
    var filters = [];
	var cqlFilters = [];
    var hasFilter = false;
	var hasCQLFilter = false;
    // LE34:End		
    for (var i = 0, len = layers.length; i < len; i++) { 
        layerNames = layerNames.concat(layers[i].params.LAYERS);
        styleNames = styleNames.concat(this.getStyleNames(layers[i]));
		// LE34:Begin
		if (layers[i].params.CQL_FILTER) {
            cqlFilters = cqlFilters.concat(layers[i].params.CQL_FILTER);
            hasCQLFilter = true;
        } else {
            //filters = filters.concat('INCLUDE');
            cqlFilters = cqlFilters.concat(' ');
        }
			
        if (layers[i].params.FILTER) {
            filters = filters.concat(layers[i].params.FILTER);
            hasFilter = true;
        } else {
            //filters = filters.concat('INCLUDE');
            filters = filters.concat(' ');
        }
        // LE34:End
    }
    var firstLayer = layers[0];
    // use the firstLayer's projection if it matches the map projection -
    // this assumes that all layers will be available in this projection
    var projection = this.map.getProjection();
    var layerProj = firstLayer.projection;
    if (layerProj && layerProj.equals(this.map.getProjectionObject())) {
        projection = layerProj.getCode();
    }
		
	// LE34:Begin
	var cqlFilter = '';
    if (hasCQLFilter) {
        for (var i = 0; i < cqlFilters.length; i++) {
            cqlFilter = cqlFilter + "(" + cqlFilters[i] + ")";
        }
    } else {
        cqlFilter = null;
    }
		
    var filter = '';
    if (hasFilter) {
        for (var i = 0; i < filters.length; i++) {
            filter = filter + "(" + filters[i] + ")";
            //				if(i < filters.length - 1) {
            //					filter = filter + ';';
            //				}
        }
    } else {
        filter = null;
    }
    // LE34:End
		
    var params = OpenLayers.Util.extend({
        service: "WMS",
        version: firstLayer.params.VERSION,
        request: "GetFeatureInfo",
        layers: layerNames,
        query_layers: layerNames,
		// LE34:Begin
		cql_filter: cqlFilter,
        filter: filter,
        // LE34:End
        styles: styleNames,
        bbox: this.map.getExtent().toBBOX(null,
            firstLayer.reverseAxisOrder()),
        feature_count: this.maxFeatures,
        height: this.map.getSize().h,
        width: this.map.getSize().w,
        format: format,
        info_format: firstLayer.params.INFO_FORMAT || this.infoFormat
    }, (parseFloat(firstLayer.params.VERSION) >= 1.3) ?
        {
            crs: projection,
            i: parseInt(clickPosition.x),
            j: parseInt(clickPosition.y)
        } :
        {
            srs: projection,
            x: parseInt(clickPosition.x),
            y: parseInt(clickPosition.y)
        }
    );
    OpenLayers.Util.applyDefaults(params, this.vendorParams);
    return {
        url: url,
        params: OpenLayers.Util.upperCaseObject(params),
        callback: function(request) {
            this.handleResponse(clickPosition, request, url);
        },
        scope: this
    };
}
