App.Map = initialize: -> maps = $("*[data-map]") if maps.length > 0 $.each maps, (index, map) -> App.Map.initializeMap map $(".js-toggle-map").on click: -> App.Map.toggleMap() initializeMap: (element) -> App.Map.cleanInvestmentCoordinates(element) mapCenterLatitude = $(element).data("map-center-latitude") mapCenterLongitude = $(element).data("map-center-longitude") markerLatitude = $(element).data("marker-latitude") markerLongitude = $(element).data("marker-longitude") zoom = $(element).data("map-zoom") mapTilesProvider = $(element).data("map-tiles-provider") mapAttribution = $(element).data("map-tiles-provider-attribution") latitudeInputSelector = $(element).data("latitude-input-selector") longitudeInputSelector = $(element).data("longitude-input-selector") zoomInputSelector = $(element).data("zoom-input-selector") removeMarkerSelector = $(element).data("marker-remove-selector") addMarkerInvestments = $(element).data("marker-investments-coordinates") editable = $(element).data("marker-editable") marker = null markerIcon = L.divIcon( className: "map-marker" iconSize: [30, 30] iconAnchor: [15, 40] html: '
' ) createMarker = (latitude, longitude) -> markerLatLng = new (L.LatLng)(latitude, longitude) marker = L.marker(markerLatLng, { icon: markerIcon, draggable: editable }) if editable marker.on "dragend", updateFormfields marker.addTo(map) return marker removeMarker = (e) -> e.preventDefault() if marker map.removeLayer(marker) marker = null clearFormfields() return moveOrPlaceMarker = (e) -> if marker marker.setLatLng(e.latlng) else marker = createMarker(e.latlng.lat, e.latlng.lng) updateFormfields() return updateFormfields = -> $(latitudeInputSelector).val marker.getLatLng().lat $(longitudeInputSelector).val marker.getLatLng().lng $(zoomInputSelector).val map.getZoom() return clearFormfields = -> $(latitudeInputSelector).val "" $(longitudeInputSelector).val "" $(zoomInputSelector).val "" return openMarkerPopup = (e) -> marker = e.target $.ajax "/investments/#{marker.options["id"]}/json_data", type: "GET" dataType: "json" success: (data) -> e.target.bindPopup(getPopupContent(data)).openPopup() getPopupContent = (data) -> content = "#{data["investment_title"]}" return content mapCenterLatLng = new (L.LatLng)(mapCenterLatitude, mapCenterLongitude) map = L.map(element.id).setView(mapCenterLatLng, zoom) L.tileLayer(mapTilesProvider, attribution: mapAttribution).addTo map if markerLatitude && markerLongitude && !addMarkerInvestments marker = createMarker(markerLatitude, markerLongitude) if editable $(removeMarkerSelector).on "click", removeMarker map.on "zoomend", updateFormfields map.on "click", moveOrPlaceMarker if addMarkerInvestments for i in addMarkerInvestments if App.Map.validCoordinates(i) marker = createMarker(i.lat, i.long) marker.options["id"] = i.investment_id marker.on "click", openMarkerPopup toggleMap: -> $(".map").toggle() $(".js-location-map-remove-marker").toggle() cleanInvestmentCoordinates: (element) -> markers = $(element).attr("data-marker-investments-coordinates") if markers? clean_markers = markers.replace(/-?(\*+)/g, null) $(element).attr("data-marker-investments-coordinates", clean_markers) validCoordinates: (coordinates) -> App.Map.isNumeric(coordinates.lat) && App.Map.isNumeric(coordinates.long) isNumeric: (n) -> !isNaN(parseFloat(n)) && isFinite(n)