/// <summary>
        /// React on map server state changed.
        /// </summary>
        /// <param name="sender">Layer, which server state changed.</param>
        /// <param name="e">Ignored.</param>
        private void Server_StateChanged(object sender, EventArgs e)
        {
            AgsServer agsServer = (AgsServer)sender;

            // index for inserting layer
            int index = 0;

            foreach (AgsLayer wrap in _agsLayers)
            {
                if (map.Layers.Contains(wrap.ArcGISLayer))
                {
                    index++;
                }
                else
                {
                    AgsMapLayer agsMapLayer = wrap.MapLayer as AgsMapLayer;
                    if (agsMapLayer != null && agsMapLayer.Server == agsServer && agsServer.State == AgsServerState.Authorized)
                    {
                        wrap.UpdateTokenIfNeeded();
                        map.Layers.Insert(index, wrap.ArcGISLayer);

                        // Check spatial reference ID is present in Map
                        if (Map.SpatialReferenceID.HasValue)
                        {
                            _SetSpatialReferenceIDToObjectLayersIfNeeded();
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Add available service layers to map and process unavailable.
        /// </summary>
        private void _InitServiceLayers()
        {
            // Save AgsLayers to list
            _agsLayers = new List <AgsLayer>();
            map.Layers.Clear();
            foreach (MapLayer layer in this.Map.Layers)
            {
                AgsMapLayer agsMapLayer = layer as AgsMapLayer;
                AgsLayer    wrap        = AgsLayerFactory.CreateLayer(agsMapLayer.Server, layer);
                _agsLayers.Add(wrap);

                // subscribe to StateChanged event to react on server state changing
                agsMapLayer.Server.StateChanged       += new EventHandler(Server_StateChanged);
                wrap.ArcGISLayer.InitializationFailed += new EventHandler <EventArgs>(ArcGISLayer_InitializationFailed);
                if (agsMapLayer.Server.State == ESRI.ArcLogistics.Services.AgsServerState.Authorized)
                {
                    map.Layers.Add(wrap.ArcGISLayer);
                }
            }

            // Check all layers availability and save it to details list
            List <MessageDetail> details = new List <MessageDetail>();

            foreach (MapLayer mapLayer in Map.Layers)
            {
                AgsMapLayer agsMapLayer = mapLayer as AgsMapLayer;
                if (agsMapLayer != null)
                {
                    if (agsMapLayer.Server.State == AgsServerState.Unavailable)
                    {
                        string        format       = (string)App.Current.FindResource("LayerUnavailable");
                        string        errorMessage = string.Format(format, mapLayer.Name);
                        MessageDetail detail       = new MessageDetail(MessageType.Error, errorMessage);
                        details.Add(detail);
                    }
                    else if (agsMapLayer.Server.State == AgsServerState.Unauthorized)
                    {
                        string format       = (string)App.Current.FindResource("LayerNotAuthorized");
                        string errorMessage = string.Format(format, mapLayer.Name, agsMapLayer.Server.Title);
                        Link   link         = new Link((string)App.Current.FindResource("LicencePanelText"),
                                                       Pages.PagePaths.LicensePagePath, LinkType.Page);
                        MessageDetail detail = new MessageDetail(MessageType.Error, errorMessage, link);
                        details.Add(detail);
                    }
                }
            }

            // Add info to messenger in case of at least one unavailable layer
            if (details.Count > 0)
            {
                App.Current.Messenger.AddError((string)App.Current.FindResource("SomeMapLayersCannotBeLoaded"), details);
            }
        }