/*

License and acknowledgements will go here...

*/

var dataLayers = {};

/* --------------------------------- */
/* Object definition for data layers */
/* --------------------------------- */
var DataLayer = function(config) {
	this.id = ''; // The ID for this layer
	this.olLayer = null; // The OpenLayers Layer Object
	this.visibleByDefault = false; // Whether this layer should be visible and added to the map when the page loads.
	this.activeOnMap = false; // Indicates when the layer is currently active on the map.
	this.searching = false; // Indicates when the layers is currently activated for searching.
	this.tablename = ''; // The table name for this layer's data.
	this.geometry_col_name = ''; // The name for the geometry column.
	this.searchableCols = []; // A list of column names that should searched by a text search.  e.g. [ 'name', 'altname', ...]
	this.featureOverrideParams = {}; // A params key/value list of values that should be override from the original WMS request when performing a feature search.

	// This is a helper function to applying feature param overrides.  It's split out from 'getFeatureParams' so that getFeatureParams can be overriden more easily.
	this.writeOverrideParams = function(params) {
		for(override in this.featureOverrideParams) {
			params[override] = this.featureOverrideParams[override];
		}
		return params;
	};
	
	// Establish OpenLayers Layer if a definition object was passed in.
	if(config.olLayerDef) {
		// Some default parameters
		var params = { styles:'', format:'image/png', tiled:'true', transparent:true, tilesOrigin:'-31.24594448,-51.77055555499996' };
		// Some default options
		var options = { buffer:0 };
		
		// Apply custom parameters
		if(config.olLayerDef.params) {
			for(prm in config.olLayerDef.params) {
				params[prm] = config.olLayerDef.params[prm];
			}
		}
		
		// Apply custom options
		if(config.olLayerDef.options) {
			for(opt in config.olLayerDef.options) {
				options[opt] = config.olLayerDef.options[opt];
			}
		}

		this.olLayer = new OpenLayers.Layer.WMS(config.olLayerDef.name, config.olLayerDef.url, params, options);
		this.olLayer.displayInLayerSwitcher = false;
	}

	// A function run by the search process that passes in default param values and allows the data layer object to inject custom params that are specific to this layer.
	this.getFeatureParams = function(params) {
		return this.writeOverrideParams(params);
	};
	
	// Takes a searchTerm and and turns it into a CQL query string based on the instance searchableCols
	this.makeFilterString = function(searchTerm) {
		var terms = searchTerm.split(' ');

		var filterString = '';
		for(var i = 0; i < terms.length; i++) {
			// don't include blank values if they got in there somehow
			if(terms[i] == '') { continue; }
		
			if(i > 0) { filterString += ' AND ' }
			
			filterString += '(';
			for(var j = 0; j < this.searchableCols.length; j++) {
				if(j > 0) {
					filterString += ' OR '
				}
				var column = this.searchableCols[j];
				var term = terms[i];
				filterString += "(";
				filterString += column + " LIKE '% " + term + " %'";
				filterString += " OR " + column + " LIKE '" + term + " %'";
				filterString += " OR " + column + " = '"+ term + "'";
				filterString += " OR " + column + " LIKE '% "+term + "' )";
			}
			filterString += ')';
		}
		return filterString;
	};

    this.makeMapServerFilterString = function(searchTerm) {
        var terms = searchTerm.split(' ');

        var filterString = '';
        for(var i = 0; i < terms.length; i++) {
            // don't include blank values if they got in there somehow
            if(terms[i] == '') { continue; }

            if(i > 0) { filterString += ' AND ' }

            filterString += '(';
            for(var j = 0; j < this.searchableCols.length; j++) {
                if(j > 0) {
                    filterString += ' OR '
                }
                var column = this.searchableCols[j];
                var term = terms[i];
                filterString += column + " ~*  '" + term + "'";
            }
            filterString += ')';
        }
        return filterString;
    }
	
	// Takes the CQL filter string and the name of the WMS param to use with it and adds it to the wms layer
	this.applySearch = function(filterParamName, filterString) {
		var wmsParams = this.olLayer.params;
		wmsParams[filterParamName] = filterString;
		this.olLayer.mergeNewParams(wmsParams);
		
		if(this.activeOnMap == false) { // This stuff shouldn't be here.  there should not be any AfricaMap.js dependencies in dataLayers.js
			AM.OL.map.addLayer(this.olLayer);
			this.activeOnMap = true;
			AM.OL.map.setLayerIndex(this.olLayer, (AM.OL.map.layers.length-1));
		}
	};

	// A function that is run when a search is performed.  This function will often be overriden.
	this.runSearch = function(searchTerm) {
		this.applySearch('CQL_FILTER', this.makeFilterString(searchTerm));
	};

    this.reset = function() {
        var wmsParams = this.olLayer.params;
	// remove any 'filter params'
	for(var p in wmsParams) {
		if(p.match(/FILTER/i)) {
			delete wmsParams[p];
		}
	}

        this.olLayer.mergeNewParams(wmsParams);
    };

	// Overrides object properties and applies new ones based on the 'params' object passed in.
	for(p in config) {
		this[p] = config[p];
	}
};

dataLayers.GeonamesFeatures6 = new DataLayer({ id:'geonames', 
	searching: false, 
	tablename: 'geonames', 
	geometry_col_name: 'geoname_geom',
	searchableCols: [ 'name','asciiname','alternatenames','keywords', 'fcode_name' ],
    // FEATURE_COUNT: undefined causes MapServer to return only a single feature from a GetFeatureInfo request
	featureOverrideParams: { map:'geonames.map', FEATURE_COUNT: undefined  },
	olLayerDef: {
		name:'Geonames Search Results', 
		url:'http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=geonames.map', 
		params: { layers:'geonomy_features', map_layer_0_class_color:'255 0 0' } 
	},
	selectedFCodes: [],
	reset: function() {
		this.selectedFCodes = [];
		var wmsParams = this.olLayer.params;
		delete wmsParams.CQL_FILTER;
		delete wmsParams.MAP_LAYER_0_FILTER;
		this.olLayer.mergeNewParams(wmsParams);
	},
	runSearch:function(searchTerm) {
		var filterString = this.makeMapServerFilterString(searchTerm);
		
		// Add custom search for fcodes that come from the Places tab
		if(this.selectedFCodes.length > 0) {
			if(filterString != '') {
				filterString += ' AND ';
			}
			filterString += '(';
			for(var f = 0; f < this.selectedFCodes.length; f++) {
				if(f > 0) {
					filterString += ' OR ';
				}
				filterString += "fcode = '" + this.selectedFCodes[f] + "'";
			}
			filterString += ')';
		}
		
		this.applySearch('MAP_LAYER_0_FILTER', filterString);
	}
});

dataLayers.Projects3 = new DataLayer({ id:'projects', 
	tablename: 'project', 
	geometry_col_name: 'the_geom',
	searchableCols: ['keywords','proj_na','pri_disc','sec_disc','descr','contact_n','contact_or'],
	featureOverrideParams: { 
        map:'project_test_wms.map', STYLES:'', LAYERS: "africamap_projects", QUERY_LAYERS: "africamap_projects"  }, 
	olLayerDef: {
		name: 'Projects Search Results',
		url: 'http://cga-5.hmdc.harvard.edu:8080/geoserver/wms',
		params: { layers:'topp:project', srs:'epsg:4326', styles:'projects_style_highlight' }
	},

    // this section must be included in a GeoServer layer as-is
	getFeatureParams: function(params) {
		params = this.writeOverrideParams(params);
		if(params.CQL_FILTER && params.CQL_FILTER != '') {
			params.MAP_LAYER_0_FILTER = params.CQL_FILTER;
			delete params.CQL_FILTER;
		}
		return params;
	}
});

dataLayers.murdock = new DataLayer({ id:'murdock',
    tablename: 'murdock',
    geometry_col_name: 'the_geom',
    searchableCols: ['keywords', 'name', 'code'],
    olLayerDef: {
        name: "Murdock Layer",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/murdock/mur.map", 
        params: { layers: 'murdock_s', map_layer_2_class_color: '255 255 0' }
    },
    featureOverrideParams: { map:'/opt/CGA/data/vec/murdock/mur.map' },
    runSearch : function(searchTerm) {
        this.applySearch('MAP_LAYER_2_FILTER', this.makeMapServerFilterString(searchTerm));
    }
});

dataLayers.gadm = new DataLayer({ id:'gadm',
    tablename: 'gadm_admin',
    geometry_col_name: 'the_geom',
    searchableCols: ['keywords', 'name_1', 'varname_1', 'name_2', 'varname_2', 'name_3', 'fips_1', 'hasc_1'],
    olLayerDef: {
        name: "Administrative Boundaries",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",
        params: { layers: 'gadm_s' , map_layer_0_class_color:'255 255 0' }
    },
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },
    runSearch : function(searchTerm) {
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));
    }
});

dataLayers.pop = new DataLayer({ id:'pop',
    tablename: 'pop_centroids',
    geometry_col_name: 'the_geom',
    searchableCols: ['keywords', 'name1', 'name2', 'name3', 'name4', 'adminid'],
    olLayerDef: {
        name: "Population Centroids",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",
        params: { layers: 'pop_s' , map_layer_1_class_color:'255 255 0' }
    },
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },
    runSearch : function(searchTerm) {
        this.applySearch('MAP_LAYER_1_FILTER', this.makeMapServerFilterString(searchTerm));
    }
});

dataLayers.hmc = new DataLayer({ id:'hmc',
    tablename: 'hmc_index',
    geometry_col_name: 'the_geom',
    searchableCols: ['cntr_map', 'mp_mk_cn', 'language', 'scale', 'start_dt', 'end_dt', 'complete', 'call_num', 'scan_nam'],
    olLayerDef: {
        name: "Map Series Boundaries",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",
        params: { layers: 'hmc' , map_layer_2_class_color:'255 255 0' }
    },
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },
    runSearch : function(searchTerm) {
        this.applySearch('MAP_LAYER_2_FILTER', this.makeMapServerFilterString(searchTerm));
    }
});

dataLayers.polities = new DataLayer({ id:'polities',                                                            
    tablename: 'polities',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'start_date', 'end_date', 'bin', 'bin_descr', 'date_range', 'period', 'name_alt', 'type_1',
 'keywords'],
    olLayerDef: {                                                                                               
        name: "polities",                                                                                       
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'polities' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1 = new DataLayer({ id:'mcevedy_1',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1",                                                                                       
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1400CE = new DataLayer({ id:'mcevedy_1400CE',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1400CE",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1400CE' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1CE = new DataLayer({ id:'mcevedy_1CE',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1CE",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1CE' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1000CE = new DataLayer({ id:'mcevedy_1000CE',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1000CE",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1000CE' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1800CE = new DataLayer({ id:'mcevedy_1800CE',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1800CE",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1800CE' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});

dataLayers.mcevedy_1900CE = new DataLayer({ id:'mcevedy_1900CE',                                                            
    tablename: 'mcevedy',                                                                                      
    geometry_col_name: 'the_geom',                                                                              
    searchableCols: ['name', 'source', 'bin_descr', 'date_range', 'layer', 'demo_layer', 
 'keywords'],
    olLayerDef: {                                                                                               
        name: "mcevedy_1900CE",
        url: "http://cga-5.hmdc.harvard.edu/cgi-bin/mapserv?map=/opt/CGA/data/vec/vec.map",                     
        params: { layers: 'mcevedy_1900CE' , map_layer_0_class_color:'255 255 0' }                                    
    },                                                                                                          
    featureOverrideParams: { map:'/opt/CGA/data/vec/vec.map' },                                                 
    runSearch : function(searchTerm) {                                                                          
        this.applySearch('MAP_LAYER_0_FILTER', this.makeMapServerFilterString(searchTerm));                     
    }                                                                                                           
});


