$.fn.googlemap = function(method_or_params) {
	if (typeof google === 'undefined')
		return false;

	return this.each(function() {

		var params, map,
			$this = $(this);
			defaults = {
				zoomControls: 1,
				marker: true,
				scale: false,
				scrollwheel: true
			};

		if( typeof method_or_params == 'object' )
			params = $.extend(defaults, method_or_params);	
		else
			params = $.extend(defaults, $this.data('params'));
			

		// Refresh map (after container resize)
		if( method_or_params == 'refresh' ) {
			map = $this.data('map');
			if( map ) {
				google.maps.event.trigger(map, 'resize');
				if( map.recenter ) {
					map.setCenter( new google.maps.LatLng(params.lat, params.lng) ); // Re-center
					// Don't do it twice (as long as the map is visible now),
					// the map would loose the user-defined position
					map.recenter = !$this.is(':visible'); 
					$this.data('map', map);
				}
				return;
			}
		}

		var buildDynamicMap = function() {
            var latlng = new google.maps.LatLng(params.lat, params.lng);
            var mapOptions = {
                scrollwheel: params.scroll,
                zoom: params.zoom,
                zoomControl: params.zoomControls > 0,
                zoomControlOptions: {
                    style: params.zoomControls == 2 ? google.maps.ZoomControlStyle.LARGE : google.maps.ZoomControlStyle.SMALL
                },
                scaleControl: params.scale,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map($this.get(0), $.extend({}, (typeof edMapConfiguration !== 'undefined' ? edMapConfiguration : {}), mapOptions));
            if (params.marker) {
                var marker = new google.maps.Marker({
                    map: map,
                    position: latlng
                });
                $this.data('marker', marker);
            }
            if (typeof params.complete === 'function') {
                params.complete(map);
            }
            // Determine if map needs to be re-centered (needed on refresh)
            map.recenter = !$this.is(':visible');
            $this.data('map', map);
		};

		var buildEmbedMap = function() {
            var type = 'view',
				query, iframe,
				queryParams = {
					key: webcard.googleMapsEmbedApiKey,
					center: params.lat + ',' + params.lng,
					zoom: params.zoom
				};

            if (params.marker) {
            	type = 'place';
                queryParams.q = queryParams.center;
			}

            query = Object.keys(queryParams)
                .map(function(k) { return encodeURIComponent(k) + '=' + encodeURIComponent(queryParams[k]); })
                .join('&');

			iframe = document.createElement('iframe');
			iframe.width = "100%;";
			iframe.height = $this.height();
			iframe.style.border = "0";
			iframe.frameBorder = "0";
			iframe.src = 'https://www.google.com/maps/embed/v1/' + type + '?' + query;
			iframe.allowFullscreen = true;

			$this.get(0).appendChild(iframe);
		};

		// As of Google Maps' new pricing of July 2018, we switched from Dynamic Maps API to the (free) Embed API for most requests
		$(function() {
			$this.html('');

			if (params.complete) {
				buildDynamicMap();
				return;
			}

			buildEmbedMap();
        });

	});
};

$(function() {
	$('.map-canvas').googlemap();
});
