public GeofenceEditPage(Geofence geofence)
        {
            data   = geofence;
            Title  = geofence.Name;
            layout = new StackLayout()
            {
                Spacing = 15
            };
            layout.Padding = new Thickness(20, 20);
            entryLayout    = new StackLayout()
            {
                Orientation = StackOrientation.Vertical, HorizontalOptions = LayoutOptions.FillAndExpand
            };
            lblLayout = new StackLayout()
            {
                Orientation = StackOrientation.Vertical, VerticalOptions = LayoutOptions.FillAndExpand
            };
            namelbl = new Label()
            {
                Text = AppResources.NomLabel, VerticalTextAlignment = TextAlignment.Center
            };
            nameEntry = new Entry()
            {
                Placeholder = AppResources.NomPlaceHolder, HorizontalOptions = LayoutOptions.FillAndExpand
            };
            nameEntry.TextChanged += (object sender, TextChangedEventArgs e) =>
            {
                if (nameEntry.Text.Length > 50)
                {
                    nameEntry.Text = nameEntry.Text.Substring(0, 50);
                }
                else if (geofence.Name != nameEntry.Text && nameEntry.Text.Length < 50)
                {
                    geofence.Name = nameEntry.Text;
                    Title         = geofence.Name;
                    didChange     = true;
                }
            };
            lblLayout.Children.Add(namelbl);
            entryLayout.Children.Add(nameEntry);
            latitudelbl = new Label()
            {
                Text = AppResources.LatitudeLabel, VerticalTextAlignment = TextAlignment.Center
            };
            latitudeEntry = new Entry()
            {
                Text = geofence.Latitude + "", Placeholder = AppResources.LatitudePlaceHolder, HorizontalOptions = LayoutOptions.FillAndExpand
            };
            latitudeEntry.Unfocused += (sender, e) =>
            {
                double value = 0;
                if (double.TryParse(latitudeEntry.Text, out value) || string.IsNullOrEmpty(latitudeEntry.Text))
                {
                    if (geofence.Latitude > value || geofence.Latitude < value)
                    {
                        geofence.Latitude = value;
                        didChange         = true;
                    }
                }
            };
            lblLayout.Children.Add(latitudelbl);
            entryLayout.Children.Add(latitudeEntry);


            longitudelbl = new Label()
            {
                Text = AppResources.LongitudeLabel, VerticalTextAlignment = TextAlignment.Center
            };
            longitudeEntry = new Entry()
            {
                Text = geofence.Longitude + "", Placeholder = AppResources.LongitudePlaceHolder, HorizontalOptions = LayoutOptions.FillAndExpand
            };
            longitudeEntry.Unfocused += (sender, e) =>
            {
                double value = 0;
                if (double.TryParse(longitudeEntry.Text, out value) || string.IsNullOrEmpty(longitudeEntry.Text))
                {
                    if (geofence.Longitude > value || geofence.Longitude < value)
                    {
                        geofence.Longitude = value;
                        didChange          = true;
                    }
                }
            };
            lblLayout.Children.Add(longitudelbl);
            entryLayout.Children.Add(longitudeEntry);

            radiuslbl = new Label()
            {
                Text = AppResources.RayonLabel, VerticalTextAlignment = TextAlignment.Center
            };
            radiusPicker = new Picker()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            foreach (var rad in GeofenceManager.GeofenceRadius)
            {
                radiusPicker.Items.Add(rad.ToString());
            }
            radiusPicker.SelectedItem          = geofence.Radius.ToString();
            radiusPicker.SelectedIndexChanged += (sender, e) =>
            {
                double val = geofence.Radius;
                double.TryParse(radiusPicker.SelectedItem.ToString(), out val);
                val = val <= 0 ? geofence.Radius : val > ApplicationConst.GeofenceMaxRadius ? ApplicationConst.GeofenceMaxRadius : val;
                radiusPicker.SelectedItem = val.ToString();
                if (geofence.Radius > val || geofence.Radius < val)
                {
                    geofence.Radius = val;
                    didChange       = true;
                }
            };

            entryLayout.Children.Add(radiusPicker);
            lblLayout.Children.Add(radiuslbl);
            formLayout = new StackLayout()
            {
                Orientation = StackOrientation.Horizontal
            };
            formLayout.Children.Add(lblLayout);
            formLayout.Children.Add(entryLayout);

            typeLayout = new StackLayout()
            {
                Orientation = StackOrientation.Horizontal
            };
            typeEnterLayout = new StackLayout();
            typeEnterLayout.Children.Add(new Label()
            {
                Text = AppResources.ActionEntreeLabel, VerticalTextAlignment = TextAlignment.Center
            });

            EnterTypePicker = new Picker()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            var EnterSoustypePicker = new Picker()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            foreach (var t in ActionManager.GetActionTypes())
            {
                EnterTypePicker.Items.Add(t);
            }

            EnterTypePicker.SelectedIndexChanged += (sender, e) =>
            {
                string value = EnterTypePicker.Items[EnterTypePicker.SelectedIndex];

                EnterSoustypePicker.Items.Clear();
                foreach (var t in ActionManager.GetActionList().Where((Action a) => a.Category == value))
                {
                    EnterSoustypePicker.Items.Add(t.Description);
                }
                EnterSoustypePicker.IsEnabled = EnterSoustypePicker.Items.Count != 0;
                if (EnterSoustypePicker.IsEnabled)
                {
                    if (!string.IsNullOrEmpty(geofence.EnterActionName))
                    {
                        var list = ActionManager.GetActionList();
                        EnterSoustypePicker.SelectedIndex = EnterSoustypePicker.Items.IndexOf(list.First(a => a.Name == geofence.EnterActionName).Description);
                    }
                    else
                    {
                        EnterSoustypePicker.SelectedIndex = 0;
                    }
                }
            };


            EnterSoustypePicker.SelectedIndexChanged += (sender, e) =>
            {
                string value = EnterSoustypePicker.SelectedIndex >= 0 ? EnterSoustypePicker.Items[EnterSoustypePicker.SelectedIndex] : "";
                if (value != "")
                {
                    var action = ActionManager.GetActionList().FirstOrDefault((a) => a.Description == value);
                    if (geofence.EnterActionName != action.Name)
                    {
                        geofence.EnterActionName = action.Name;
                        didChange = true;
                    }
                }
                else
                {
                    geofence.EnterActionName = "";
                }
            };

            typeExitLayout = new StackLayout();
            typeExitLayout.Children.Add(new Label()
            {
                Text = AppResources.ActionSortieLabel, VerticalTextAlignment = TextAlignment.Center
            });

            var ExitTypePicker = new Picker()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            var ExitSoustypePicker = new Picker()
            {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };

            foreach (var t in ActionManager.GetActionTypes())
            {
                ExitTypePicker.Items.Add(t);
            }
            ExitTypePicker.SelectedIndexChanged += (sender, e) =>
            {
                string value = ExitTypePicker.Items[ExitTypePicker.SelectedIndex];
                ExitSoustypePicker.Items.Clear();

                foreach (var t in ActionManager.GetActionList().Where(a => a.Category == value))
                {
                    ExitSoustypePicker.Items.Add(t.Description);
                }
                ExitSoustypePicker.IsEnabled = ExitSoustypePicker.Items.Count != 0;
                if (ExitSoustypePicker.IsEnabled)
                {
                    if (!string.IsNullOrEmpty(geofence.ExitActionName))
                    {
                        ExitSoustypePicker.SelectedIndex = ExitSoustypePicker.Items.IndexOf(ActionManager.GetActionList().First(a => a.Name == geofence.ExitActionName).Description);
                    }
                    else
                    {
                        ExitSoustypePicker.SelectedIndex = 0;
                    }
                }
            };


            ExitSoustypePicker.SelectedIndexChanged += (sender, e) =>
            {
                string value = ExitSoustypePicker.SelectedIndex >= 0 ? ExitSoustypePicker.Items[ExitSoustypePicker.SelectedIndex] : "";
                if (value != "")
                {
                    var action = ActionManager.GetActionList().FirstOrDefault((a) => a.Description == value);
                    if (geofence.ExitActionName != action.Name)
                    {
                        geofence.ExitActionName = action.Name;
                        didChange = true;
                    }
                }
                else
                {
                    geofence.ExitActionName = "";
                }
            };

            string category = ActionManager.Null;

            if (!string.IsNullOrEmpty(geofence.EnterActionName))
            {
                if (ActionManager.GetActionList().Any(a => geofence.EnterActionName == a.Name))
                {
                    var enterAction = ActionManager.GetActionList().First(a => geofence.EnterActionName == a.Name);
                    category = enterAction.Category;
                }
                else
                {
                    geofence.EnterActionName = string.Empty;
                    category = ActionManager.Null;
                }
            }
            EnterTypePicker.SelectedItem = category;


            category = ActionManager.Null;

            if (!string.IsNullOrEmpty(geofence.ExitActionName))
            {
                var list = (ActionManager.GetActionList());
                if (list.Any(a => geofence.ExitActionName == a.Name))
                {
                    var exitAction = list.First(a => geofence.ExitActionName == a.Name);
                    category = exitAction.Category;
                }
                else
                {
                    geofence.ExitActionName = string.Empty;
                    category = ActionManager.Null;
                }
            }
            ExitTypePicker.SelectedItem = category;

            typeEnterLayout.Children.Add(EnterTypePicker);
            typeEnterLayout.Children.Add(EnterSoustypePicker);

            typeExitLayout.Children.Add(ExitTypePicker);
            typeExitLayout.Children.Add(ExitSoustypePicker);

            typeLayout.Children.Add(typeEnterLayout);
            typeLayout.Children.Add(typeExitLayout);
            delaylbl = new Label()
            {
                Text = AppResources.DelaiNotificationLabel, VerticalTextAlignment = TextAlignment.Center
            };
            delayLayout = new StackLayout();
            delayLayout.Children.Add(delaylbl);

            delayPicker = new HMSTimePicker {
                HorizontalOptions = LayoutOptions.FillAndExpand
            };
            delayPicker.Time       = new TimeSpan(0, 0, (int)geofence.NotificationDelay);
            delayPicker.Unfocused += (sender, e) =>
            {
                var time = (uint)delayPicker.Time.TotalSeconds;
                if (time > uint.MaxValue)
                {
                    time = uint.MaxValue;
                }
                if (time != geofence.NotificationDelay)
                {
                    geofence.NotificationDelay = time;
                    didChange = true;
                }
            };
            delayLayout.Children.Add(delayPicker);



            map = new Button()
            {
                WidthRequest = App.Width / 2, Text = AppResources.CarteButton
            };
            map.Clicked += (sender, e) =>
            {
                var loc = new Location()
                {
                    Latitude = geofence.Latitude, Longitude = geofence.Longitude
                };
                App.Instance.PushPage(new MapPage(loc));
            };

            layout.Children.Add(formLayout);
            layout.Children.Add(map);
            layout.Children.Add(typeLayout);
            layout.Children.Add(delayLayout);


            if (geofence.PublicFlag == 0)
            {
                accesSwitch = new ChoiceSwitch()
                {
                    LeftOption = AppResources.AccesGeofencePrivate, RightOption = AppResources.AccesGeofencePublic
                };

                accesSwitch.SelectedIndexChanged += (sender, e) =>
                {
                    geofence.PublicFlag = accesSwitch.SelectedIndex;
                };
                layout.Children.Add(accesSwitch);
            }
            ScrollView scrollview = new ScrollView();

            scrollview.Content = layout;
            Content            = scrollview;
            didChange          = false;
        }
        /// <summary>
        /// Initialize this instance.
        /// </summary>
        private void Initialize()
        {
            if (geofence == null)
            {
                var data = App.GeofenceManager.GetPendingGeofenceRequest();
                geofence = data ?? new Geofence()
                {
                    Latitude = 0, Longitude = 0
                };
            }

            InitializeComponent();
            switchNotification.IsToggled = true;
            labelLongitude.Text          = AppResources.LongitudeLabel;
            entryLongitude.Placeholder   = AppResources.LongitudePlaceHolder;
            labelLatitude.Text           = AppResources.LatitudeLabel;
            entryLatitude.Placeholder    = AppResources.LatitudePlaceHolder;
            btnMap.Text            = AppResources.CarteButton;
            nameEntry.Placeholder  = AppResources.NomLieuPlaceHolder;
            notificationLabel.Text = AppResources.ActiverNotificationLabel;
            enterActionLabel.Text  = AppResources.ActionEntreeLabel;
            exitActionLabel.Text   = AppResources.ActionSortieLabel;
            btnSave.Text           = AppResources.EnregistrerBouton;
            btnCancel.Text         = AppResources.AnnulerBouton;


            if (geofence != null)
            {
                entryLatitude.Text  = geofence.Latitude.ToString();
                entryLongitude.Text = geofence.Longitude.ToString();

                btnMap.Clicked += (sender, e) =>
                {
                    var loc = new Location()
                    {
                        Latitude = geofence.Latitude, Longitude = geofence.Longitude
                    };
                    var map = new MapPage(loc);
                    Navigation.PushAsync(map);
                };


                btnSave.Clicked += (sender, e) =>
                {
                    if (!string.IsNullOrEmpty(nameEntry.Text))
                    {
                        geofence.Name = nameEntry.Text;
                        geofence.NotificationEnabled = switchNotification.IsToggled;
                        geofence.Radius      = ApplicationConst.DefaultGeofenceRadius;
                        geofence.User        = App.UserNoseq;
                        geofence.ServerNoseq = App.ServerInfoList.First((arg) => App.ServerInfoNoseq == arg.Noseq).Domain;
                        App.GeofenceManager.AddGeofence(geofence);
                        Navigation.PopAsync();
                    }
                    else
                    {
                        nameEntry.PlaceholderColor = Color.Red;
                    }
                };

                btnCancel.Clicked += (sender, e) =>
                {
                    Navigation.PopAsync();
                };

                nameEntry.Focused += (sender, e) =>
                {
                    nameEntry.PlaceholderColor = Color.Gray;
                };

                nameEntry.Unfocused += (sender, e) =>
                {
                    if (nameEntry.Text.Length > ApplicationConst.GeofenceNameMaxSize)
                    {
                        nameEntry.Text = nameEntry.Text.Substring(0, ApplicationConst.GeofenceNameMaxSize);
                    }
                    else if (string.IsNullOrEmpty(nameEntry.Text))
                    {
                        nameEntry.PlaceholderColor = Color.Red;
                    }
                };
                entryLatitude.Unfocused += (sender, e) =>
                {
                    double lat = 0;
                    if (double.TryParse(entryLatitude.Text, out lat))
                    {
                        geofence.Latitude = lat;
                    }
                    else
                    {
                        entryLatitude.Text = geofence.Latitude.ToString();
                    }
                };

                entryLongitude.Unfocused += (sender, e) =>
                {
                    double lon = 0;
                    if (double.TryParse(entryLongitude.Text, out lon))
                    {
                        geofence.Longitude = lon;
                    }
                    else
                    {
                        entryLongitude.Text = geofence.Longitude.ToString();
                    }
                };



                //Type Picker
                foreach (var t in ActionManager.GetActionTypes())
                {
                    EnterTypePicker.Items.Add(t);
                }

                EnterTypePicker.SelectedIndexChanged += (sender, e) =>
                {
                    string value = EnterTypePicker.Items[EnterTypePicker.SelectedIndex];

                    EnterSoustypePicker.Items.Clear();
                    foreach (var t in ActionManager.GetActionList().Where((Action a) => a.Category == value))
                    {
                        EnterSoustypePicker.Items.Add(t.Description);
                    }
                    EnterSoustypePicker.IsEnabled = EnterSoustypePicker.Items.Count != 0;
                    if (EnterSoustypePicker.IsEnabled)
                    {
                        if (!string.IsNullOrEmpty(geofence.EnterActionName))
                        {
                            EnterSoustypePicker.SelectedIndex = EnterSoustypePicker.Items.IndexOf(ActionManager.GetActionList().First(a => a.Name == geofence.EnterActionName).Description);
                        }
                        else
                        {
                            EnterSoustypePicker.SelectedIndex = 0;
                        }
                    }
                };


                EnterSoustypePicker.SelectedIndexChanged += (sender, e) =>
                {
                    string value = EnterSoustypePicker.SelectedIndex >= 0 ? EnterSoustypePicker.Items[EnterSoustypePicker.SelectedIndex] : "";
                    if (value != "")
                    {
                        var action = ActionManager.GetActionList().FirstOrDefault((a) => a.Description == value);
                        geofence.EnterActionName = action.Name;
                    }
                    else
                    {
                        geofence.EnterActionName = "";
                    }
                };

                foreach (var t in ActionManager.GetActionTypes())
                {
                    ExitTypePicker.Items.Add(t);
                }
                ExitTypePicker.SelectedIndexChanged += (sender, e) =>
                {
                    string value = ExitTypePicker.Items[ExitTypePicker.SelectedIndex];
                    ExitSoustypePicker.Items.Clear();

                    foreach (var t in ActionManager.GetActionList().Where(a => a.Category == value))
                    {
                        ExitSoustypePicker.Items.Add(t.Description);
                    }
                    ExitSoustypePicker.IsEnabled = ExitSoustypePicker.Items.Count != 0;
                    if (ExitSoustypePicker.IsEnabled)
                    {
                        if (!string.IsNullOrEmpty(geofence.ExitActionName))
                        {
                            ExitSoustypePicker.SelectedIndex = ExitSoustypePicker.Items.IndexOf(ActionManager.GetActionList().First(a => a.Name == geofence.ExitActionName).Description);
                        }
                        else
                        {
                            ExitSoustypePicker.SelectedIndex = 0;
                        }
                    }
                };


                ExitSoustypePicker.SelectedIndexChanged += (sender, e) =>
                {
                    string value = ExitSoustypePicker.SelectedIndex >= 0 ? ExitSoustypePicker.Items[ExitSoustypePicker.SelectedIndex] : "";
                    if (value != "")
                    {
                        var action = ActionManager.GetActionList().FirstOrDefault((a) => a.Description == value);
                        geofence.ExitActionName = action.Name;
                    }
                    else
                    {
                        geofence.ExitActionName = "";
                    }
                };

                string category = ActionManager.Null;

                if (!string.IsNullOrEmpty(geofence.EnterActionName))
                {
                    var enterAction = ActionManager.GetActionList().First(a => geofence.EnterActionName == a.Name);
                    category = enterAction.Category;
                }
                EnterTypePicker.SelectedItem = category;

                category = ActionManager.Null;

                if (!string.IsNullOrEmpty(geofence.ExitActionName))
                {
                    var exitAction = ActionManager.GetActionList().First(a => geofence.EnterActionName == a.Name);
                    category = exitAction.Category;
                }
                ExitTypePicker.SelectedItem = category;


                delayLabel = new Label()
                {
                    Text = AppResources.DelaiNotificationLabel, VerticalTextAlignment = TextAlignment.Center
                };
                delayLayout.Children.Add(delayLabel);
                delayPicker = new HMSTimePicker {
                    HorizontalOptions = LayoutOptions.FillAndExpand
                };
                try
                {
                    delayPicker.Time = new TimeSpan(0, ApplicationConst.DefaultGeofenceTriggerTime / 60, ApplicationConst.DefaultGeofenceTriggerTime % 60);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e.Message);
                }
                delayPicker.Unfocused += (sender, e) =>
                {
                    var time = (uint)delayPicker.Time.TotalSeconds;
                    if (time > uint.MaxValue)
                    {
                        time = uint.MaxValue;
                    }
                    if (time != geofence.NotificationDelay)
                    {
                        geofence.NotificationDelay = time;
                    }
                };
                delayLayout.Children.Add(delayPicker);

                labelRadius.Text = AppResources.RayonLabel;
                foreach (var rad in GeofenceManager.GeofenceRadius)
                {
                    radiusPicker.Items.Add(rad.ToString());
                }
                radiusPicker.SelectedIndexChanged += (sender, e) => CheckEntryRadius();
                radiusPicker.SelectedItem          = ApplicationConst.DefaultGeofenceRadius.ToString();

                ChoiceSwitch accesSwitch = new ChoiceSwitch()
                {
                    LeftOption = AppResources.AccesGeofencePrivate, RightOption = AppResources.AccesGeofencePublic
                };

                accesSwitch.SelectedIndexChanged += (sender, e) =>
                {
                    geofence.PublicFlag = accesSwitch.SelectedIndex;
                };
                AccesLayout.Children.Add(accesSwitch);
            }
        }