<?xml version="1.0" encoding="utf-8"?>
<!--
     Copyright 2008 Google Inc.
     Licensed under the Apache License, Version 2.0:
     http://www.apache.org/licenses/LICENSE-2.0
-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                width="100%"
                height="100%"
                layout="absolute"
                viewSourceURL="srcview/index.html">
    <mx:Panel title="Nearest Placemark Search with Google Maps Demo"
              width="100%"
              height="100%">
        <mx:VBox width="100%"
                 height="100%">
            <mx:HBox width="100%"
                     height="25">
                <mx:Label text="Enter address: "/>
                <mx:TextInput id="address"
                              text="2400 4TH AVE APT 368 SEATTLE, WA 98121"
                              dropShadowColor="0x000000"
                              enter="doGeocode(event);"/>
                <mx:Button id="submitButton"
                           label="Search"
                           click="doGeocode(event);"/>
            </mx:HBox>
            <mx:UIComponent id="mapHolder"
                            initialize="onHolderCreated(event);"
                            resize="onHolderResized(event)"
                            width="100%"
                            height="100%"/>
        </mx:VBox>
    </mx:Panel>
    <mx:Script>
        <![CDATA[
            import com.google.maps.InfoWindowOptions;
            import com.google.maps.LatLng;
            import com.google.maps.LatLngBounds;
            import com.google.maps.Map;
            import com.google.maps.MapEvent;
            import com.google.maps.MapMouseEvent;
            import com.google.maps.MapType;
            import com.google.maps.controls.ZoomControl;
            import com.google.maps.overlays.Marker;
            import com.google.maps.overlays.MarkerOptions;
            import com.google.maps.services.ClientGeocoder;
            import com.google.maps.services.ClientGeocoderOptions;
            import com.google.maps.services.GeocodingEvent;
            import mx.controls.Alert;

            private var map:Map;
            private var theMarkers:Array=[];

            public function onHolderCreated(event:Event):void
            {
                map=new Map();
                map.key="ABQIAAAA7QUChpcnvnmXxsjC7s1fCxQGj0PqsCtxKvarsoS-iqLdqZSKfxTd7Xf-2rEc_PC9o8IsJde80Wnj4g";
                map.addEventListener(MapEvent.MAP_READY, onMapReady);
                mapHolder.addChild(map);
            }

            public function onHolderResized(event:Event):void
            {
                map.setSize(new Point(mapHolder.width, mapHolder.height));
            }

            private function onMapReady(event:Event):void
            {
                map.enableScrollWheelZoom();
                map.enableContinuousZoom();
                map.setCenter(new LatLng(47.614495, -122.341861), 13);
                map.addControl(new ZoomControl());
                getXml();
            }

            public function getXml():void
            {
                var xmlString:URLRequest=new URLRequest("markers.xml");
                var xmlLoader:URLLoader=new URLLoader(xmlString);
                xmlLoader.addEventListener("complete", readXml);
            }

            public function readXml(event:Event):void
            {
                var markersXML:XML=new XML(event.target.data);
                var markers:XMLList=markersXML..marker;
                var markersCount:int=markers.length();
                var i:Number;
                for(i=0; i < markersCount; i++)
                {
                    var markerXml:XML=markers[i];
                    var name:String=markerXml.@name;
                    var address:String=markerXml.@address;
                    var latlng:LatLng=new LatLng(markerXml.@lat, markerXml.@lng);
                    var marker:Marker=createMarker(latlng, name, address);
                    theMarkers.push({name:name, address:address, latlng:latlng, marker:marker});
                }
            }


            public function createMarker(latlng:LatLng, name:String, address:String):Marker
            {
                var marker:Marker=new Marker(latlng);
                var html:String="<b>" + name + "</b> <br/>" + address;
                marker.addEventListener(MapMouseEvent.CLICK, function(e:MapMouseEvent):void
                    {
                        marker.openInfoWindow(new InfoWindowOptions({contentHTML:html}));
                    });
                return marker;
            }

            // Helper to create a comparison function which compares distances
            // of two points from a given base point.
            private function distanceCmp(point:LatLng):Function
            {
                return function(a:Object, b:Object):Number
                    {
                        return point.distanceFrom(a.latlng) - point.distanceFrom(b.latlng);
                    }
            }

            private function doGeocode(event:Event):void
            {
                // Geocoding example
                var geocoder:ClientGeocoder=new ClientGeocoder();

                geocoder.addEventListener(GeocodingEvent.GEOCODING_SUCCESS, function(event:GeocodingEvent):void
                    {
                        var placemarks:Array=event.response.placemarks;
                        if (placemarks.length > 0)
                        {
                            map.setCenter(placemarks[0].point);
                            var marker:Marker=new Marker(placemarks[0].point);
                            marker.addEventListener(MapMouseEvent.CLICK, function(event:MapMouseEvent):void
                                {
                                    marker.openInfoWindow(new InfoWindowOptions({content:placemarks[0].address}));
                                });
                            map.clearOverlays();
                            map.addOverlay(marker);
                            // Now sort the markers and show 3 nearest
                            theMarkers.sort(distanceCmp(placemarks[0].point));
                            for(var i=0; i < 3; ++i)
                            {
                                map.addOverlay(theMarkers[i].marker);
                            }
                        }
                    });
                geocoder.addEventListener(GeocodingEvent.GEOCODING_FAILURE, function(event:GeocodingEvent):void
                    {
                        Alert.show("Geocoding failed");
                    });
                geocoder.geocode(address.text);
            }
        ]]>
    </mx:Script>
</mx:Application>