/// <summary>
        /// Zoom map to a feature layer's extent. If its SR is different than the base map's, re-project the extent
        /// </summary>
        private void MenuItemZoomTo_Click(object sender, MenuItemClickEventArgs e)
        {
            HideConextMenu();

            if (e.ItemTag is LivingMapLayer)
            {
                LivingMapLayer mapConfig = e.ItemTag as LivingMapLayer;
                Envelope       extent    = this.MapControl.Layers[mapConfig.ID].FullExtent;
                if (!SpatialReference.AreEqual(extent.SpatialReference, this.MapControl.SpatialReference, false))
                {
                    GeometryTool.ProjectEnvelope(this.AppConfig.GeometryService, extent, this.MapSRWKID, (s, g) =>
                    {
                        if (g.ProjectedGeometry != null)
                        {
                            this.MapControl.ZoomTo(g.ProjectedGeometry);
                        }
                    });
                }
                else
                {
                    this.MapControl.ZoomTo(extent);
                }
            }
            else if (e.ItemTag is TOCNodeInfo)
            {
                TOCNodeInfo nodeInfo = e.ItemTag as TOCNodeInfo;
                if (nodeInfo.LayerExtent == null)
                {
                    this.IsBusy = true;
                    Layer  layer    = this.MapControl.Layers[nodeInfo.MapID];
                    string layerUrl = (nodeInfo.IsTiledMap) ? (layer as ArcGISTiledMapServiceLayer).Url : (layer as ArcGISDynamicMapServiceLayer).Url;
                    ArcGISLayerInfoReader layerInfoReader = new ArcGISLayerInfoReader(layerUrl + "/" + nodeInfo.LayerID);
                    layerInfoReader.InfoReady += (obj, arg) =>
                    {
                        if (!SpatialReference.AreEqual(arg.LayerInfo.Extent.SpatialReference, this.MapControl.SpatialReference, false))
                        {
                            GeometryTool.ProjectEnvelope(this.AppConfig.GeometryService, arg.LayerInfo.Extent, this.MapSRWKID, (s, g) =>
                            {
                                this.IsBusy = false;
                                if (g.ProjectedGeometry != null)
                                {
                                    nodeInfo.LayerExtent = g.ProjectedGeometry as Envelope;
                                    this.MapControl.ZoomTo(nodeInfo.LayerExtent);
                                }
                            });
                        }
                        else
                        {
                            this.IsBusy          = false;
                            nodeInfo.LayerExtent = nodeInfo.LayerExtent = arg.LayerInfo.Extent;
                            this.MapControl.ZoomTo(nodeInfo.LayerExtent);
                        }
                    };
                }
                else
                {
                    this.MapControl.ZoomTo(nodeInfo.LayerExtent);
                }
            }
        }