/**
		 * Gets all inspectionitems from DB if they already exists, and creates them if they don't already 
		 */
		private static Inspection GetOrCreateInspectionItems(
			ApplicationDbContext ctx,
			Checklist checklist,
			Inspection inspection)
		{
			foreach (var ci in checklist.ChecklistChecklistItems.Select(joinItem => joinItem.ChecklistItem))
			{
				var inspectionItem = inspection.InspectionItems.SingleOrDefault(item => item.ChecklistItem.Id == ci.Id);
				if (inspectionItem == null)
				{
					inspectionItem = new InspectionItem
					{
						ChecklistItem = ci,
						Inspection = inspection
					};

					inspection.InspectionItems.Add(inspectionItem);
					ctx.InspectionItems.Add(inspectionItem);
				}
			}

			TrySave(ctx);

			return inspection;
		}
		public static bool UpdateInspectionItemCannedResponses(
			ApplicationDbContext ctx,
			InspectionItem inspectionItem,
			IList<Guid> selectedCannedResponseIds)
		{
			foreach (var inspectionItemCannedResponse in inspectionItem.InspectionItemCannedResponses)
			{
				var cannedResponse = inspectionItemCannedResponse.CannedResponse;
				ctx.CannedResponses.Attach(cannedResponse);
			}

			inspectionItem.InspectionItemCannedResponses = 
				selectedCannedResponseIds
					.Select(crId => ctx.CannedResponses.Single(cr => cr.Id == crId))
					// FIXME DJC EF Many2Many - Had to widen from just adjusting canned responses, so this may impact property tracking
					.Select(cr => new InspectionItemCannedResponse
					{
						InspectionItem = inspectionItem,
						CannedResponse = cr,
						InspectionItemId = inspectionItem.Id,
						CannedResponseId = cr.Id
					})
					.ToList();

			return TrySave(ctx);
		}
		// Return value indicates success of operation
		public static bool UpdateInspectionItemCondition(
			ApplicationDbContext ctx,
			InspectionItem inspectionItem,
			InspectionItemCondition inspectionItemCondition)
		{
			// Only change condition and canned response if different from previous condition
			if (inspectionItem.Condition == inspectionItemCondition)
			{
				return true;
			}

			inspectionItem.Condition = inspectionItemCondition;

			// Clear canned response IDs when switching conditions.
			// This is because otherwise, the inspection table's select box and the DB (and thus the report) can get out of sync
			foreach (var inspectionItemCannedResponse in inspectionItem.InspectionItemCannedResponses)
			{
				var cannedResponse = inspectionItemCannedResponse.CannedResponse;
				ctx.CannedResponses.Attach(cannedResponse);
			}
			// FIXME DJC EF Many2Many - Determine if this still works. Its possible EF won't see this as clearing with the new many-many join style
			inspectionItem.InspectionItemCannedResponses = new List<InspectionItemCannedResponse>();

			return TrySave(ctx);
		}
		public static bool UpdateInspectionItemNote(
			ApplicationDbContext ctx,
			InspectionItem inspectionItem,
			string note)
		{
			inspectionItem.Note = note;
			return TrySave(ctx);
		}
		public static bool UpdateIsCustomerConcern(
			ApplicationDbContext ctx,
			InspectionItem inspectionItem,
			bool isCustomerConcern)
		{
			inspectionItem.IsCustomerConcern = isCustomerConcern;

			return TrySave(ctx);
		}
		public static bool AddInspectionItemImage(
			ApplicationDbContext ctx,
			InspectionItem inspectionItem,
			Image image)
		{
			var inspectionImage = new InspectionImage
			{
				Id = image.Id,
				Title = image.Title,
				CreatedDate = image.CreatedDate,
				ImageUrl = image.ImageUrl,
				InspectionItem = inspectionItem
			};

			inspectionItem.InspectionImages.Add(inspectionImage);
			ctx.InspectionImages.Add(inspectionImage);

			return TrySave(ctx);
		}