var myMap = function() {
	var d = new Date();
	
	var	options = {
		zoom: 4,
		center: new google.maps.LatLng(51.00,13.00),
		mapTypeId: google.maps.MapTypeId.TERRAIN
	}

	/*
		Load the map then markers
		@param object settings (configuration options for map)
		@return undefined
	*/
	function init(settings) {
		map = new google.maps.Map(document.getElementById( settings.idSelector ), options);
		
		 var ctaLayer = new google.maps.KmlLayer({
          url: 'https://www.saksonski-szlak-parowozow.pl/assets/php/dbr-kml.php?t='+d.getTime(),
          map: map,
					zoom: 4
        });		
		
		markerLocation = settings.markerLocation;
		loadMarkers();
	}

	/*
		=======
		MARKERS
		=======
	*/
	markers = {};
	markerList = [];

	/*
		Load markers onto the Google Map from a provided array or dbrData (data.js)
		@param array dbrList [optional] (list of steam route to load)
		@return undefined
	*/
	function loadMarkers(dbrList) {

		/* optional argument of person */
		var partner = ( typeof dbrList !== 'undefined' ) ? dbrList : dbrData;

		var j = 1; /* for lorempixel */
		for( i=0; i < partner.length; i++ ) {
			var person = partner[i];

			/* if its already on the map, dont put it there again */
			if( markerList.indexOf(person.id) !== -1 ) continue;

			var lat = person.lat,
				lng = person.lng,
				markerId = person.id;

			var infoWindow = new google.maps.InfoWindow({
				maxWidth: 600
			});

if (person.zindex==1) {
			var marker = new google.maps.Marker({
				position: new google.maps.LatLng( lat, lng ),
				title: person.name,
				markerId: markerId,
				icon: person.icon,			
				map: map,
				animation: google.maps.Animation.DROP,
				zIndex: google.maps.Marker.MAX_ZINDEX + person.zindex
			});
}
else {
			var marker = new google.maps.Marker({
				position: new google.maps.LatLng( lat, lng ),
				title: person.name,
				markerId: markerId,
				icon: person.icon,		
				zIndex: google.maps.Marker.MAX_ZINDEX + person.zindex,	
				map: map
			});
}

			markers[markerId] = marker;
			markerList.push(person.id);

if (person.flt13==1 && person.imglink!=person.link) {
person.stationsschild = ['<br><a href="', person.imglink,'" target="_blank">Stationsschild anzeigen</a><br><br>'].join('');
}
else {
person.stationsschild = '';
}

if (person.image!="") {
			var content = ['<div class="iw"><a href="', person.imglink,'" target="_blank"><img src="', person.image,
				'" style="margin:8px 0px;" class="img-fluid"></a>', '<div class="iw-text"><strong>', person.name,
				'</strong><br><br>', person.cert,	person.stationsschild, '<p class="mt-10"><a href="', person.link,'"><i class="far fa-angle-right"></i> weitere Informationen</a></p></div></div>'].join('');
}
else {
				var content = ['<div class="iw"><div class="iw-text"><strong>', person.name,
				'</strong><br><br>', person.cert, '<p class="mt-10"><a href="', person.link,'"><i class="far fa-angle-right"></i> weitere Informationen</a></p></div></div>'].join('');
}
	

			google.maps.event.addListener(marker, 'click', (function (marker, content) {
				return function() {
					infoWindow.setContent(content);
					infoWindow.open(map, marker);
				}
			})(marker, content));	
		}
	}

	/*
		Remove marker from map and our list of current markers
		@param int id (id of the marker element)
		@return undefined
	*/
	function removeDBRMarker(id) {
		if( markers[id] ) {
			markers[id].setMap(null);
			loc = markerList.indexOf(id);
			if (loc > -1) markerList.splice(loc, 1);
			delete markers[id];
		}
	}

	/*
		======
		FILTER
		======
	*/

	/* default all filters off */
	var filter = {
		flt01:0,
		flt02:0,
		flt03:0,
		flt04:0,
		flt05:0,
		flt06:0,
		flt07:0,
		flt08:0,
		flt09:0,
		flt10:0,
		flt11:0,
		flt12:0,
		flt13:0

	}
	var filterMap;

	/*
		Helper function
		@param array a (array of arrays)
		@return array (common elements from all arrays)
	*/
function reduceArray(a) {



if ($("#filt-radio2").is(":checked")) {

 /* or */

	var target = [];
	for (var prop in a) {
		$("#status1").append(a[prop].length + " | ");
		for (var desc in a[prop]) {		
			if (target.indexOf(a[prop][desc]) === -1) {
			target.push( a[prop][desc] );
			}
		}
	}
 	var c=target;
	return c;
}
else {

 /* and */
 	
		r = a.shift().reduce(function(res, v) {
			if (res.indexOf(v) === -1 && a.every(function(a) {
				return a.indexOf(v) !== -1;
			})) res.push(v);
			return res;
		}, []);


	return r;
}

	
	}



	/*
		Helper function
		@param string n
		@return bool
	*/
	function isInt(n) {
	    return n % 1 === 0;
	}


	/*
		Decides which filter function to call and stacks all filters together
		@param string filterType (the property that will be filtered upon)
		@param string value (selected filter value)
		@return undefined
	*/
	function filterCtrl(filterType, value) {
		/* result array */
		var results = [];

		if( isInt(value) ) {
			filter[filterType] = parseInt(value);
		} else {
			filter[filterType] = value;
		}
		
		
		for( k in filter ) {
			if( !filter.hasOwnProperty(k) && !( filter[k] !== 0 ) ) {
				/* all the filters are off */
				loadMarkers();
				return false;
			} else if ( filter[k] !== 0 ) {
				/* call filterMap function and append to r array */
				results.push( filterMap[k]( filter[k] ) );
			} else {
			
				/* fail silently */
			}
		}

		if( filter[filterType] === 0 ){
			var i=0;
			for( k in filter ) {
				if (filter[k]!==0) {
				i++;
				}
			}		
			if (i===0) { 		
		  results.push( dbrData );
		  } 
		}
		/*
			if there is 1 array (1 filter applied) set it,
			else find markers that are common to every results array (pass every filter)
		*/
		if( results.length === 1 ) {
			results = results[0];
		} else {
			results = reduceArray( results );
		}
		
		loadMarkers( results );

	}
	
	/* 
		The keys in this need to be mapped 1-to-1 with the keys in the filter variable.
	*/
	filterMap = {	
		flt01: function( value ) {	return filterByString('flt01', value);	},
		flt02: function( value ) {	return filterByString('flt02', value);	},
		flt03: function( value ) {	return filterByString('flt03', value);	},
		flt04: function( value ) {	return filterByString('flt04', value);	},
		flt05: function( value ) {	return filterByString('flt05', value);	},
		flt06: function( value ) {	return filterByString('flt06', value);	},
		flt07: function( value ) {	return filterByString('flt07', value);	},
		flt08: function( value ) {	return filterByString('flt08', value);	},
		flt09: function( value ) {	return filterByString('flt09', value);	},
		flt10: function( value ) {	return filterByString('flt10', value);	},
		flt11: function( value ) {	return filterByString('flt11', value);	},
		flt12: function( value ) {	return filterByString('flt12', value);	},
		flt13: function( value ) {	return filterByString('flt13', value);	}	
	}

	/*
		Filters marker data based upon a string match
		@param string dataProperty (the key that will be filtered upon)
		@param string value (selected filter value)
		@return array (partner that made it through the filter)
	*/
	function filterByString( dataProperty, value ) {
		var partner = [];

		for( var i=0; i < dbrData.length; i++ ) {
			var person = dbrData[i];
			if( person[dataProperty] == value ) {
				partner.push( person );
			} else {
				removeDBRMarker( person.id );
			}
		}
		return partner;
	}

	/*
		Filters out integers that are under the provided value
		@param string dataProperty (the key that will be filtered upon)
		@param int value (selected filter value)
		@return array (partner that made it through the filter)
	*/
	function filterIntsLessThan( dataProperty, value ) {
			var partner = [];

			for( var i=0; i < dbrData.length; i++ ) {
				var person = dbrData[i];
				if( person[dataProperty] > value ) {
					partner.push( person )
				} else {
					removeDBRMarker( person.id );
				}
			}
			return partner;
	}



	/* Takes all the filters off */
	function resetFilter() {
		filter = {
			flt01:0,
			flt02:0,
			flt03:0,
			flt04:0,
			flt05:0,
			flt06:0,
			flt07:0,
			flt08:0,
			flt09:0,
			flt10:0,
			flt11:0,
			flt12:0,
			flt13:0
		}
	}

	return {
		init: init,
		loadMarkers: loadMarkers,
		filterCtrl: filterCtrl,
		resetFilter: resetFilter
	};
}();
