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())
            });

            PF('map').addOverlay(currentMarker);

            PF('dlg').show();
        }	
    }

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

        currentMarker = null;
        PF('dlg').hide();
    }

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

        return false;
    }
</script>