private Frame GetExerciseFrame(Exercise exercise)
		{
			StackLayout exerciseStackLayout = new StackLayout
			{
				Orientation = StackOrientation.Horizontal,
				VerticalOptions = LayoutOptions.FillAndExpand,
				Spacing = 0,
			};

			StackLayout exerciseLabelContainerStack = new StackLayout
			{
				Padding = new Thickness(0, 0, 5, 0),
				Spacing = 10
			};

			var exerciseFrame = new Frame
			{
				Content = exerciseStackLayout,
				HasShadow = false,
				BackgroundColor = (Color)Application.Current.Resources["ymcaLightBlue"]
			};

			var tapGestureRecognizer2 = new TapGestureRecognizer();
			tapGestureRecognizer2.Tapped += async (s2, e2) =>
			{
				if (_viewModel.IsBusy)
				{
					return;
				}
				_viewModel.IsBusy = true;
				await exerciseFrame.FadeTo(0);
				//MemberExerciseViewModel simpleMemberExercise = new MemberExerciseViewModel (exercise, _memberExerciseCollection);
				MemberExerciseViewModel simpleMemberExercise = new MemberExerciseViewModel(exercise);

				//Uses session tracking
				Insights.Track("Viewed exercise in simple member exercise container", new Dictionary<string, string>() {
					{ "exercise", simpleMemberExercise.Exercise.Exercisename },
					{ "exercise id", simpleMemberExercise.Exercise.ExerciseID.ToString () }
				});



				await this.Navigation.PushAsync(new MemberExercisePage(simpleMemberExercise, false));
				await exerciseFrame.FadeTo(1, 500);
				_viewModel.IsBusy = false;
			};

			//exerciseFrame.GestureRecognizers.Add (tapGestureRecognizer2);
			exerciseStackLayout.GestureRecognizers.Add(tapGestureRecognizer2);

			Label exerciseCategoryLabel = new Label
			{
				Text = exercise.ExerciseType,
				FontAttributes = FontAttributes.Bold,
				VerticalOptions = LayoutOptions.Start,
				Style = (Style)Application.Current.Resources["exerciseNameLabelStyle"]
			};


			Label exerciseNameLabel = new Label
			{
				Text = exercise.Exercisename,
				Style = (Style)Application.Current.Resources["exerciseNameLabelStyle"]
			};

			Image exerciseImage = new Image
			{
				Source = exercise.ImageSource,
				Style = (Style)Application.Current.Resources["exerciseImageStyle"]
			};

			exerciseLabelContainerStack.Children.Add(exerciseCategoryLabel);
			exerciseLabelContainerStack.Children.Add(exerciseNameLabel);

			//exerciseStackLayout.Children.Add (exerciseNameLabel);
			exerciseStackLayout.Children.Add(exerciseLabelContainerStack);
			exerciseStackLayout.Children.Add(exerciseImage);
			return exerciseFrame;
		}
		public MemberExercisePage (MemberExerciseViewModel exercise, bool isExerciseEdit = false)
		{
			InitializeComponent ();

			Title = isExerciseEdit ? "Modify Exercise" : "Add Exercise";

			_viewModel = exercise;
			_isExerciseEdit = isExerciseEdit;
			this.BindingContext = _viewModel;

			if (_viewModel.Exercise.EquipmentType == "Machine") {

				foreach (string seatPosLabel in MemberExerciseViewModel.SeatPositionLabelOptions) {
					seatPositionLabelPicker1.Items.Add (seatPosLabel);
					seatPositionLabelPicker2.Items.Add (seatPosLabel);
					seatPositionLabelPicker3.Items.Add (seatPosLabel);
					seatPositionLabelPicker4.Items.Add (seatPosLabel);
				}

				seatPositionLabelPicker1.SetBinding (Picker.SelectedIndexProperty, "SeatPosition1Label");
				seatPositionLabelPicker2.SetBinding (Picker.SelectedIndexProperty, "SeatPosition2Label");
				seatPositionLabelPicker3.SetBinding (Picker.SelectedIndexProperty, "SeatPosition3Label");
				seatPositionLabelPicker4.SetBinding (Picker.SelectedIndexProperty, "SeatPosition4Label");

			} else {

				seatPositionStack.IsVisible = false;
			}

			if (_viewModel.Exercise.EquipmentType == "Hold") {
				RepsLabel.Text = "Hold (Secs): ";
			}

			if (_viewModel.Exercise.IsMask) {
				WeightLabel.Text = "Target Pins:";
			}

			if (_viewModel.Exercise.IsBodyWeight) {
				WeightLabel.IsVisible = false;
				weightEntry.IsVisible = false;
			
			} 




			cancelButton.Clicked += (sender, args) => {
				string addEditString = "";
				if (!_isExerciseEdit) {
					addEditString = "add";
				} else {
					addEditString = "edit";
				}

				Action cancelAction = async () => {
					if (!_isExerciseEdit) {
						//Remove the addexercisecontainerpage from the stack so that the user doesn't land on that page after clicking the cancel button
						//this.Navigation.RemovePage (this.Navigation.NavigationStack [this.Navigation.NavigationStack.Count - 2]);
						await App.Current.MainPage.Navigation.PopAsync (false);
					}

					//Uses session tracking
					Insights.Track ("Cancel exercise " + addEditString, new Dictionary<string, string> () {
						{ "Exercise", exercise.Exercise.Exercisename },
						{ "Exercise id", exercise.Exercise.ExerciseID.ToString () }
					});

					await App.Current.MainPage.Navigation.PopAsync (false);

				};
				DependencyService.Get<ICustomDialog> ().Display ("Cancel exercise " + addEditString + "?", "No", "Yes", cancelAction);
			};

			createExerciseButton.Clicked += async (sender, args) => {
				if ((_viewModel.Sets != 0 && _viewModel.Reps != 0) || _viewModel.Duration != 0)
				{
					if (!_isExerciseEdit) {
						// _viewModel.Exercise = exercise.Exercise;
						//_viewModel.SimpleExerciseCollection.Add (_viewModel);
						MessagingCenter.Send<MemberExercisePage, MemberExerciseViewModel> (this, "ExerciseAdded", _viewModel);
						//Uses session tracking
						Insights.Track ("Added exercise to member program", new Dictionary<string, string> () {
							{ "Exercise", exercise.Exercise.Exercisename },
							{ "Exercise id", exercise.Exercise.ExerciseID.ToString () }
						});
				
						//Remove the addexercisecontainerpage from the stack so that the user doesn't land on that page after clicking the create button
						//App.Current.MainPage.Navigation.RemovePage (App.Current.MainPage.Navigation.NavigationStack [App.Current.MainPage.Navigation.NavigationStack.Count - 2]);
						await App.Current.MainPage.Navigation.PopAsync (false);
	                   
					} else {
						MessagingCenter.Send<MemberExercisePage, MemberExerciseViewModel> (this, "ExerciseModified", _viewModel);
						//MessagingCenter.Send<MemberExercisePage> (this, "ExerciseModified");
						//_viewModel.SimpleExerciseCollection.
						//Uses session tracking
						Insights.Track ("Viewed or modified a member exercise in their program", new Dictionary<string, string> () {
							{ "Exercise", exercise.Exercise.Exercisename },
							{ "Exercise id", exercise.Exercise.ExerciseID.ToString () }
						});
					}

					await App.Current.MainPage.Navigation.PopAsync (true);
				} else {
					StringBuilder displayMessageSB = new StringBuilder("Exercises cannot be added with 0 ");
					if (_viewModel.IsCardio)
					{
						displayMessageSB.Append("minutes.");
					}
					else {
						displayMessageSB.Append("sets or 0 reps.");
					}
					DependencyService.Get<ICustomDialog> ().Display (displayMessageSB.ToString(), "OK");
				}
			};



			if (isExerciseEdit) {

				ToolbarItem cancelItem = new ToolbarItem {
					Text = "Cancel",
					Icon = Device.OnPlatform ("cancel.png", "ic_action_cancel", "Images/cancel.png"),
					Order = ToolbarItemOrder.Primary
				};

				cancelItem.Clicked += (sender, args) => {
					Action cancelAction = async () => {

						//Uses session tracking
						Insights.Track ("Cancel exercise edit", new Dictionary<string, string> () {
							{ "Exercise", exercise.Exercise.Exercisename },
							{ "Exercise id", exercise.Exercise.ExerciseID.ToString () }
						});
            

						await this.Navigation.PopAsync ();

					};
					DependencyService.Get<ICustomDialog> ().Display ("Cancel exercise edit?", "No", "Yes", cancelAction);
					
				};
				this.ToolbarItems.Add (cancelItem);

				ToolbarItem deleteItem = new ToolbarItem {
					Text = "Delete",
					Icon = Device.OnPlatform ("discard.png", "ic_action_discard.png", "Images/delete.png"),
					Order = ToolbarItemOrder.Primary
				};

				deleteItem.Clicked += (sender, args) => {
					Action deleteAction = async () => {
						//Uses session tracking
						Insights.Track ("Deleted exercise from exercise list", new Dictionary<string, string> () {
							{ "Exercise", exercise.Exercise.Exercisename },
							{ "Exercise id", exercise.Exercise.ExerciseID.ToString () }
						});
						MessagingCenter.Send<MemberExercisePage, MemberExerciseViewModel> (this, "ExerciseDeleted", _viewModel);
						await this.Navigation.PopAsync ();
					};
					DependencyService.Get<ICustomDialog> ().Display ("Delete this exercise?", "No", "Yes", deleteAction, true);
				};

				this.ToolbarItems.Add (deleteItem);

			}

		}
		private void GetMemberExercises()
		{


			Device.BeginInvokeOnMainThread(async () =>
			{
				List<UserWorkoutTemplateMapping> exerciseList = await UserWorkoutTemplateMappingDAL.GetMappingsByUserProfileIDAndUserExerciseGroupID(this.ProfileID, this.LocalUserExerciseGroupID);

				SimpleExerciseCollection.CollectionChanged -= SyncExercises;


				foreach (var mapping in exerciseList)
				{

					MemberExerciseViewModel simpleExercise = new MemberExerciseViewModel();
					var exercise = await ExerciseDAL.GetExercisesByExerciseID(App.WorkoutCreatorContext.StaffMember.GymID, mapping.ExerciseID);
					if (exercise != null && exercise.Id != 0)
					{
						simpleExercise.Exercise = exercise;
						simpleExercise.ImageSource = exercise.ImageSource;
						simpleExercise.Reps = mapping.TargetReps;
						simpleExercise.Sets = mapping.TargetSets;
						simpleExercise.Weight = mapping.TargetWeight;

						simpleExercise.Duration = mapping.TargetDurationMin;
						simpleExercise.TargetHRMin = mapping.TargetHRMin;
						simpleExercise.TargetHRMax = mapping.TargetHRMax;

						simpleExercise.IsCardio = exercise.CardioExID != 0 ? true : false;


						simpleExercise.SeatPosition1Value = mapping.SeatPosValue1;

						simpleExercise.SeatPosition2Value = mapping.SeatPosValue2;

						simpleExercise.SeatPosition3Value = mapping.SeatPosValue3;

						simpleExercise.SeatPosition4Value = mapping.SeatPosValue4;


						if (mapping.SeatPosLabel1 != "")
						{
							simpleExercise.SeatPosition1Label = MemberExerciseViewModel.SeatPositionLabelOptions.FindIndex(a => a.Equals(mapping.SeatPosLabel1));
						}
						else {
							simpleExercise.SeatPosition1Label = -1;
						}
						if (mapping.SeatPosLabel2 != "")
						{
							simpleExercise.SeatPosition2Label = MemberExerciseViewModel.SeatPositionLabelOptions.FindIndex(a => a.Equals(mapping.SeatPosLabel2));
						}
						else {
							simpleExercise.SeatPosition2Label = -1;
						}
						if (mapping.SeatPosLabel3 != "")
						{
							simpleExercise.SeatPosition3Label = MemberExerciseViewModel.SeatPositionLabelOptions.FindIndex(a => a.Equals(mapping.SeatPosLabel3));
						}
						else {
							simpleExercise.SeatPosition3Label = -1;
						}
						if (mapping.SeatPosLabel4 != "")
						{
							simpleExercise.SeatPosition4Label = MemberExerciseViewModel.SeatPositionLabelOptions.FindIndex(a => a.Equals(mapping.SeatPosLabel4));
						}
						else {
							simpleExercise.SeatPosition4Label = -1;
						}
						SimpleExerciseCollection.Add(simpleExercise);
					}
					else {
						//If exercise is not available manually throw error and log to insights
						try
						{
							throw new Exception("Exercise id " + mapping.ExerciseID.ToString() + "is not in the phone's database");
						}
						catch (Exception e)
						{
							Insights.Report(e);
						}
					}
				}


				//Wire up event to changed

				SimpleExerciseCollection.CollectionChanged += SyncExercises;
			});

		}
		public void Setup(){
			mockStaffMemberDataRepository = new Mock<IStaffMember> ();
			mockExercise = new Mock<IExercise> ();

			//Create 2 simple exercise objects
			MemberExerciseViewModel exercise1 = new MemberExerciseViewModel ();
			exercise1.SetsIndex= 1;
			exercise1.RepsIndex = 2;
			exercise1.WeightIndex = 2;
			exercise1.SeatPosition1Label = 1;
			exercise1.SeatPosition1Value = 1;

			MemberExerciseViewModel exercise2 = new MemberExerciseViewModel ();
			exercise1.SetsIndex = 2;
			exercise1.RepsIndex = 1;
			exercise1.WeightIndex = 2;
			exercise1.SeatPosition1Label = 2;
			exercise1.SeatPosition1Value = 1;

			//Add exercises to observable collection
            _memberExerciseViewModelCollection = new ObservableCollection<MemberExerciseViewModel>();
            _memberExerciseViewModelCollection.Add(exercise1);
            _memberExerciseViewModelCollection.Add(exercise2);

			StaffMember staffMember = new StaffMember ();
			staffMember.FirstName = "Clay";
			staffMember.LastName = "Martin";
			staffMember.GymID = 8;
			staffMember.PhoneNumber = "5024171595";
			staffMember.StaffID = 132;

            _templateFolder = new TemplateFolder();
			_templateFolder.StaffMember = staffMember;

			exercise = new Exercise ();
			exercise.ExerciseName = "Barbell Bench Press";
			exercise.Bodypart = "Chest";
			exerciseList = new List<Exercise> ();
			exerciseList.Add (exercise);

			exercise = new Exercise ();
			exercise.ExerciseName = "Barbell Inclie Bench Press";
			exercise.Bodypart = "Chest";
			exerciseList = new List<Exercise> ();
			exerciseList.Add (exercise);

			exercise = new Exercise ();
			exercise.ExerciseName = "Barbell Row";
			exercise.Bodypart = "Back";
			exerciseList = new List<Exercise> ();
			exerciseList.Add (exercise);

			exercise = new Exercise ();
			exercise.ExerciseName = "DB Row";
			exercise.Bodypart = "Back";
			exerciseList = new List<Exercise> ();
			exerciseList.Add (exercise);

			exercise = new Exercise ();
			exercise.ExerciseName = "DB Shoulder Press";
			exercise.Bodypart = "Shoulders";
			exerciseList = new List<Exercise> ();
			exerciseList.Add (exercise);

            workoutCreatorViewModel = new AddExerciseWorkoutContainerViewModel(_templateFolder, mockExercise.Object);
		}