public override async void Bind(MapPage page)
        {
            base.Bind(page);
            base.RegisterElementTypes(typeof(PlanItemPopup), typeof(Ellipse));

            Way selected = PlanningTab.Current.SelectedWay.Way;

            double north = double.MinValue, west = double.MaxValue, south = double.MaxValue, east = double.MinValue;

            foreach (var item in selected)
            {
                Microsoft.Phone.Maps.Controls.MapPolyline line = new Microsoft.Phone.Maps.Controls.MapPolyline
                {
                    StrokeColor     = item.Route.RouteGroup.GetColors().MainColor,
                    StrokeThickness = 8
                };

                foreach (var x in item.ShapePoints)
                {
                    line.Path.Add(Convert(x));
                    north = Math.Max(north, x.Latitude);
                    east  = Math.Max(east, x.Longitude);
                    south = Math.Min(south, x.Latitude);
                    west  = Math.Min(west, x.Longitude);
                }
                page.Map.MapElements.Add(line);

                //Microsoft.Phone.Maps.Controls.MapLayer mapLayer = new Microsoft.Phone.Maps.Controls.MapLayer();
                //mapLayer.Add(new MapOverlay()
                //{
                //    GeoCoordinate = line.Path[line.Path.Count / 2],
                //    Content = new Pushpin() { Content = item.Route.RouteGroup.Name + " - " + item.Route.Name }
                //});
                //Map.Layers.Add(mapLayer);

                PutStopCircle(page, item.Route, item.StartStop, item.StartTime, item.StopCount, item == selected.First() ? PlanItemPopupType.Start : PlanItemPopupType.MidStart);
                PutStopCircle(page, item.Route, item.EndStop, item.EndTime, item.StopCount, item == selected.Last() ? PlanItemPopupType.Finish : PlanItemPopupType.MidFinish);
            }

            this.EmptyMapTap   += (sender, args) => closePopups(page);
            this.MapElementTap += (sender, element) =>
            {
                if (element is Ellipse)
                {
                    tapActions[(Ellipse)element].Invoke();
                }
            };

            await Task.Delay(250);

            page.Map.SetView(new LocationRectangle(north, west, south, east), MapAnimationKind.None);
        }
        public override async void Bind(MapPage page)
        {
            base.Bind(page);
            base.RegisterElementTypes(typeof(TripStopPopup), typeof(Ellipse));

            var trip = App.Model.GetTripByID(
                int.Parse(page.NavigationContext.QueryString["tripId"]),
                int.Parse(page.NavigationContext.QueryString["routeId"])
                );
            var      routeGroup = trip.Route.RouteGroup;
            int      position   = int.Parse(page.NavigationContext.QueryString["position"]);
            DateTime dateTime   = DateTime.Parse(page.NavigationContext.QueryString["dateTime"]);

            Microsoft.Phone.Maps.Controls.MapPolyline line = new Microsoft.Phone.Maps.Controls.MapPolyline
            {
                StrokeColor     = trip.Route.RouteGroup.GetColors().MainColor,
                StrokeThickness = 8
            };
            Way.Entry entry = new Way.Entry(trip.TripType);
            line.Path.AddRange(entry.ShapePoints.Select(c => Convert(c)));
            page.Map.MapElements.Add(line);

            int i     = 0;
            var stops = trip.Stops;

            foreach (var stop in stops)
            {
                MapLayer mapLayer = new MapLayer();
                var      content  = new Ellipse
                {
                    Fill            = new SolidColorBrush(i == 0 ? routeGroup.GetColors().SecondaryColorBrush.Color : i == position ? Colors.White : i < position ? routeGroup.GetColors().PrimaryColorBrush.Color : Colors.White),
                    Stroke          = trip.Route.RouteGroup.GetColors().MainColorBrush,
                    StrokeThickness = 3,
                    Width           = 26,
                    Height          = 26
                };
                mapLayer.Add(new MapOverlay()
                {
                    GeoCoordinate  = Convert(stop.Item2.Coordinate),
                    PositionOrigin = new Point(0.5, 0.5),
                    Content        = content
                });
                page.Map.Layers.Add(mapLayer);

                int curPos = i;
                tapActions[content] = delegate()
                {
                    clearOpenedOpopup(page);

                    var popupContent = new TripStopPopup();
                    popupContent.Initialize(trip, curPos, stops[position].Item1);
                    popupContent.StopClick += (sender1, clickedStop) =>
                    {
                        string uri = String.Format("/StopPage.xaml?id={0}&dateTime={1}&location={2}", clickedStop.Group.ID, dateTime + stops[curPos].Item1 - stops[position].Item1, clickedStop.ID);
                        page.NavigationService.Navigate(new Uri(uri, UriKind.Relative));
                    };
                    MapLayer popupLayer = new MapLayer();
                    popupLayer.Add(new MapOverlay()
                    {
                        GeoCoordinate  = Convert(stop.Item2.Coordinate),
                        PositionOrigin = new Point(0.5, 1),
                        Content        = popupContent
                    });
                    currentPopupLayer = popupLayer;
                    page.Map.Layers.Add(popupLayer);
                };

                i++;
            }

            this.EmptyMapTap   += (sender, args) => clearOpenedOpopup(page);
            this.MapElementTap += (sender, element) =>
            {
                if (element is Ellipse)
                {
                    tapActions[(Ellipse)element].Invoke();
                }
            };

            var boundaries = GetBoundaries(stops.Select(s => Convert(s.Item2.Coordinate)));
            await Task.Delay(250);

            page.Map.SetView(boundaries, MapAnimationKind.None);
        }