public async void OnItemSelected(object sender, ItemTappedEventArgs args)
        {
            var item = args.Item.CastTo(new{
                GroomingTimeSlotText = "",
                GroomingTimeSlotHour = 0,
                IconText             = ""
            });

            if (item == null)
            {
                return;
            }

            if (AppHelperFunctions.UserHasAlreadyBookedGroomingAppointmentFor
                    (viewModel.SelectedGroomingDate, item.GroomingTimeSlotText))
            {
                var response = await DisplayAlert("Schedule Conflict", "You have already scheduled an appointment for today. Proceeding will override your current schedule", "OK", "Cancel");

                if (!response)
                {
                    return;
                }
            }

            var errMessage = string.Empty;

            if (!IsSchedulingAvailForViewOption(item, out errMessage))
            {
                await DisplayAlert("Scheduling Error", errMessage, "OK");

                return;
            }

            if (!await IsSlotAvailableOnServer(item))
            {
                await DisplayAlert("Scheduling Error", "The selected grooming time slot is already booked. Please select another.", "OK");

                return;
            }



            var page = (PetsList)ViewFactory.CreatePage <PetListingViewModel, PetsList> ((v, p) =>
            {
                v.OnPetListItemSelected = this.OnPetSelected;
                v.ShowHeader            = true;
            });

            selectedGroomingListItem = item;
            await Navigation.PushModalAsync(page);
        }
        private void Activate()
        {
            segment.AddSegment("Today");
            segment.AddSegment("Tomorrow");
            segment.AddSegment("Week");
            segment.TintColor = AppSettings.Constants.DarkGrayBackgroundTintColor;
            segment.SelectedSegmentChanged += SelectedSegmentItemChanged;

            (segment.Content as StackLayout).Children [2].IsEnabled = false;             //The "Week" option is disabled for this release
            if (Device.OS == TargetPlatform.Android)
            {
                ((segment.Content as StackLayout).Children [2] as Button).TextColor = Color.FromHex("#cccccc");
                ((segment.Content as StackLayout).Children [2] as Button).Opacity   = .50;
            }

            this.GroomingSelectionViewContainer.Content = new StackLayout()
            {
                Children  = { segment },
                IsVisible = AppHelperFunctions.UserHasRegisteredPets()
            };
        }
        public async void OnItemSelected(object sender, ItemTappedEventArgs args)
        {
            var item = args.Item as DynamicJObjectViewModel;

            if (item == null)
            {
                return;
            }


            if (item.Value <string> ("name") == "Boarding")
            {
                string message = AppHelperFunctions
                                 .CreateServiceContactInformationMessage("boarding", company.CompanyName, company.Email, company.PhoneNumber);
                await DisplayAlert("Boarding Coming Soon!", message, "OK");
            }
            else
            {
                await Navigation.PushAsync(new PetGroomingScheduleList());
            }
            PetServicesList.SelectedItem = null;
        }
        protected async override void OnAppearing()
        {
            base.OnAppearing();

            if (!AppHelperFunctions.UserHasRegisteredPets())
            {
                this.PetGroomingServicesList.IsVisible = false;

                this.UnauthorizedText.IsVisible = true;
                await DisplayAlert("Feature Disabled",
                                   @"In order to use this feature, you must first create your pet's basic and grooming profile from the 'My Pets' tab.", "OK");

                return;
            }
            this.GroomingSelectionViewContainer.IsVisible =
                this.PetGroomingServicesList.IsVisible    = true;

            using (var l = App.GetLoadingDialog(AppSettings.Constants.LoaderText))
            {
                l.Show();
                try
                {
                    await viewModel.LoadGroomingSlots();

                    this.PetGroomingServicesList.ItemsSource = null;
                    this.PetGroomingServicesList.ItemsSource = viewModel.PetServicesGroomingSlots;

                    l.Hide();
                    if (viewModel.PetServicesGroomingSlots.Count == 0)
                    {
                        await DisplayAlert("Load Error", "There are no grooming appointments available for today.", "OK");
                    }
                } catch
                {
                    l.Hide();
                    await DisplayAlert(AppSettings.Constants.DisplayGeneralErrorDlgTitle, AppSettings.Constants.DisplayGeneralErrorDlgMessage, "OK");
                }
            }
        }
        private async void ScheduleGrooming()
        {
            var    loader                 = App.GetLoadingDialog(AppSettings.Constants.SchedulingGroomingLoaderText);
            var    apiResponse            = new ApiResponse();
            string scheduledAppointmentId = string.Empty;

            Action <string, bool> removeLoader = async(txt, isError) =>
            {
                loader.Hide();
                if (isError)
                {
                    await DisplayAlert(AppSettings.Constants.DisplayGeneralErrorDlgTitle, txt, "OK");
                }
                else
                {
                    await DisplayAlert("Grooming Appointment Success", txt, "OK");

                    await Navigation.PopModalAsync();
                }
            };

            //Validate

            var errs = new List <string> ();

            if (!IsValidForm(errs))
            {
                errs.Insert(0, AppSettings.Constants.FormErrorDlgMessage + System.Environment.NewLine);
                var message = string.Join(System.Environment.NewLine, errs);
                await DisplayAlert(AppSettings.Constants.FormErrorDlgTitle, message);

                return;
            }

            loader.Show();
            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.waiverAccepted = WaiverAccepted;
            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.vaccines.vaccinationsCurrent = VaccinationsCurrent;
            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.waiverAcceptedDate           = DateTime.Now;

            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.vaccines.bordetella = Bordetella.ToString("d");
            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.vaccines.rabies     = Rabies.ToString("d");
            SelectedPetForGrooming.PetDetails.GroomingProfileDocument.vaccines.dhlpp      = DHLPP.ToString("d");


            Debug.WriteLine(JsonConvert.SerializeObject(SelectedPetForGrooming.PetDetails, Newtonsoft.Json.Formatting.Indented));
            //Save Grooming First Because it may return a conflict
            apiResponse = await InvokeSaveGroomingAppointment();

            if (!apiResponse.IsSuccessStatusCode)
            {
                if (apiResponse.StatusCode == (int)System.Net.HttpStatusCode.Conflict)
                {
                    removeLoader("We apologize, but the grooming appointment time is no longer available. Please select another.", true);
                    return;
                }

                removeLoader("We apologize, but we are unable to schedule your grooming appointment. Please try again.", true);
                return;
            }
            scheduledAppointmentId = apiResponse.Data.Value <String> ("confirmationId");
                        #if DEBUG
            Debug.WriteLine("scheduledAppointmentId:{0}", scheduledAppointmentId);
                        #endif
            apiResponse = new ApiResponse();
            apiResponse = await InvokeSaveProfileChanges();

            //if it fails, then remove the appointment by id

            removeLoader(string.Format(groomingSuccessMessage,
                                       SelectedPetForGrooming.PetOwnerName, GroomingDateTime), false);

            //Save to Cache
            await AppHelperFunctions.SaveGroomingAppointmentToCache(GroomingDate, GroomingTime);
        }