GMap - Adding Markers

This examples demonstrates how to add a marker and keep client side representation in sync with the server side model. Even though you use Google Maps as a JSF component you can still take advantage of the full Google Maps API.

Source

<p:growl id="messages" showDetail="true" />

<p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" 
	style="width:600px;height:400px"
	model="#{mapBean.emptyModel}" 
	onPointClick="handlePointClick(event);" 
	widgetVar="map" />
	
<p:dialog widgetVar="dlg" showEffect="fade">
	<h:form prependId="false">
		<h:panelGrid columns="2">
			<h:outputLabel for="title" value="Title:" />
			<p:inputText id="title" value="#{mapBean.title}" />
			
			<f:facet name="footer">
				<p:commandButton value="Add" 
						actionListener="#{mapBean.addMarker}" 
						update="messages" 
						oncomplete="markerAddComplete()"/>
				<p:commandButton value="Cancel" onclick="return cancel()"/>
			</f:facet>
		</h:panelGrid>
		
		<h:inputHidden id="lat" value="#{mapBean.lat}" />
		<h:inputHidden id="lng" value="#{mapBean.lng}" />
	</h:form>
</p:dialog>

<script type="text/javascript">
	var currentMarker = null;
	
	function handlePointClick(event) {
		if(currentMarker == null) {
			document.getElementById('lat').value = event.latLng.lat();
			document.getElementById('lng').value = event.latLng.lng();

			currentMarker = new google.maps.Marker({
				position:new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())
			});
							
			map.addOverlay(currentMarker);

			dlg.show();
		}	
	}

	function markerAddComplete() {
		var title = document.getElementById('title');
		currentMarker.setTitle(title.value);
		title.value = "";

		currentMarker = null;
		dlg.hide();
	}

	function cancel() {
		dlg.hide();
		currentMarker.setMap(null);
		currentMarker = null;

		return false;
	}
</script>