# Source: map-settings.js

    /**
     * @namespace WPGMZA
     * @module MapSettings
     * @requires WPGMZA
     */
    (function($) {

    	WPGMZA.MapSettings = function(element)
    	{
    		var str = element.getAttribute("data-settings");
    		var json = JSON.parse(str);

    		//var id = $(element).attr("data-map-id");
    		//var json = JSON.parse(window["wpgmza_map_settings_" + id]);

    		WPGMZA.assertInstanceOf(this, "MapSettings");

    		for(var key in json)
    		{
    			var value = json[key];

    			if(String(value).match(/^-?\d+$/))
    				value = parseInt(value);

    			this[key] = value;
    		}
    	}

    	WPGMZA.MapSettings.prototype.toOLViewOptions = function()
    	{
    		var options = {
    			center: ol.proj.fromLonLat([-119.4179, 36.7783]),
    			zoom: 4
    		};

    		function empty(name)
    		{
    			if(typeof self[name] == "object")
    				return false;

    			return !self[name] || !self[name].length;
    		}

    		// Start location
    		if(typeof this.start_location == "string")
    		{
    			var coords = this.start_location.replace(/^\(|\)$/g, "").split(",");
    			if(WPGMZA.isLatLngString(this.start_location))
    				options.center = ol.proj.fromLonLat([
    					parseFloat(coords[1]),
    					parseFloat(coords[0])
    				]);
    			else
    				console.warn("Invalid start location");
    		}

    		if(this.center)
    		{
    			options.center = ol.proj.fromLonLat([
    				parseFloat(this.center.lng),
    				parseFloat(this.center.lat)
    			]);
    		}

    		// Start zoom
    		if(this.zoom)
    			options.zoom = parseInt(this.zoom);

    		if(this.start_zoom)
    			options.zoom = parseInt(this.start_zoom);

    		// Zoom limits
    		// TODO: This matches the Google code, so some of these could be potentially put on a parent class
    		if(!empty("min_zoom"))
    			options.minZoom = parseInt(this.min_zoom);
    		if(!empty("max_zoom"))
    			options.maxZoom = parseInt(this.max_zoom);

    		return options;
    	}

    	WPGMZA.MapSettings.prototype.toGoogleMapsOptions = function()
    	{
    		var self = this;
    		var latLngCoords = (this.start_location && this.start_location.length ? this.start_location.split(",") : [36.7783, -119.4179]);

    		function empty(name)
    		{
    			if(typeof self[name] == "object")
    				return false;

    			return !self[name] || !self[name].length;
    		}

    		function formatCoord(coord)
    		{
    			if($.isNumeric(coord))
    				return coord;
    			return parseFloat( String(coord).replace(/[\(\)\s]/, "") );
    		}

    		var latLng = new google.maps.LatLng(
    			formatCoord(latLngCoords[0]),
    			formatCoord(latLngCoords[1])
    		);

    		var zoom = (this.start_zoom ? parseInt(this.start_zoom) : 4);

    		if(!this.start_zoom && this.zoom)
    			zoom = parseInt( this.zoom );

    		var options = {
    			zoom:			zoom,
    			center:			latLng
    		};

    		if(!empty("center"))
    			options.center = new google.maps.LatLng({
    				lat: parseFloat(this.center.lat),
    				lng: parseFloat(this.center.lng)
    			});

    		if(!empty("min_zoom"))
    			options.minZoom = parseInt(this.min_zoom);
    		if(!empty("max_zoom"))
    			options.maxZoom = parseInt(this.max_zoom);

    		// These settings are all inverted because the checkbox being set means "disabled"
    		options.zoomControl 			= !(this.map_zoom == true);
    		options.panControl 				= !(this.map_pan == true);
    		options.mapTypeControl			= !(this.disable_map_type_controls == true);
    		options.streetViewControl		= !(this.map_streetview == true);
    		options.fullscreenControl		= !(this.map_full_screen_control == true);

    		options.draggable				= !(this.map_draggable == true);
    		options.disableDoubleClickZoom	= !(this.map_clickzoom == true);
    		options.scrollwheel				= !(this.map_scroll == true);

    		if(this.force_greedy_gestures)
    			options.gestureHandling = "greedy";

    		switch(parseInt(this.map_type))
    		{
    			case 2:
    				options.mapTypeId = google.maps.MapTypeId.SATELLITE;
    				break;

    			case 3:
    				options.mapTypeId = google.maps.MapTypeId.HYBRID;
    				break;

    			case 4:
    				options.mapTypeId = google.maps.MapTypeId.TERRAIN;
    				break;

    			default:
    				options.mapTypeId = google.maps.MapTypeId.ROADMAP;
    				break;
    		}

    		if(this.theme_data && this.theme_data.length > 0)
    		{
    			try{
    				options.styles = JSON.parse(this.theme_data);
    			}catch(e) {
    				alert("Your theme data is not valid JSON and has been ignored");
    			}
    		}

    		return options;
    	}
    })(jQuery);