# See: http://wiki.flightgear.org/MapStructure
# Class things:
var name = 'VFRChart';
var parents = [OverlayLayer.Controller];
var __self__ = caller(0)[0];
OverlayLayer.Controller.add(name, __self__);
TileLayer.add(name, {
	parents: [TileLayer],
	type: name, # Layer type
	df_controller: __self__, # controller to use by default -- this one
});

var new = func(layer) {
	var m = {
		parents: [__self__],
		layer: layer,
		map: layer.map,
		listeners: [],
		source: nil,
	};

	#layer.makeURL = string.compileTemplate('http://vfrmap.com/20140918/tiles/vfrc/{z}/{y}/{x}.jpg');
	#layer.makePath = string.compileTemplate(layer.maps_base ~ '/vfrchart/{z}/{x}/{tms_y}.png');

	layer.max_zoom = 14;
	layer.min_zoom = 4;

	m.sources = [
			{ name : 'US',
				url : 'http://vfrmap.com/20140918/tiles/vfrc/{z}/{tms_y}/{x}.jpg',
				path : layer.maps_base ~ '/vfrmap/{z}/{tms_y}/{x}.jpg',
				min_zoom : 3, max_zoom : 12,
				min_lat : 16, max_lat : 72,
				min_lon : -179, max_lon: -60
			},
			{ name: 'DE',
			 url : 'https://secais.dfs.de/static-maps/ICAO500-2015-EUR-Reprojected_07/tiles/{z}/{x}/{y}.png',
			 path : layer.maps_base ~ '/secais/{z}/{x}/{y}.png',
			 min_zoom : 5, max_zoom : 15,
			 min_lat : 46, max_lat : 55.1,
			 min_lon : 5, max_lon: 16.5  }
		];


	m.addVisibilityListener();
	m.addRangeListener();
	m.addScreenRangeListener();


	return m;
};

var updateLayer = func() {
	# Choose a source for the maps based on location.  For the moment
	# this purely based on lat/lon bounds, but should be something
	# more advanced as we get more sources.
	var lat = me.map.getLat();
	var lon = me.map.getLon();


	foreach	(var source; me.sources) {
		if ((source.min_lat < lat) and (source.max_lat > lat) and
				(source.min_lon < lon) and (source.max_lon > lon)   )
		{
			if (source.name != me.source) {
				me.layer.min_zoom = source.min_zoom;
				me.layer.max_zoom = source.max_zoom;
				me.layer.makeURL = string.compileTemplate(source.url);
				me.layer.makePath = string.compileTemplate(source.path);
				me.source = source.name;
			}
		}
	}
};

var del = func() {
	#print(name~".lcontroller.del()");
	foreach (var l; me.listeners)
		removelistener(l);
};