/// <summary>
        /// Verify the UI template can be saved.
        /// </summary>
        /// <param name="invalidReason">A message describing why the validation failed. Set to <see cref="String.Empty" /> when
        /// validation succeeds.</param>
        /// <returns><c>true</c> if business rules for saving are satisfied, <c>false</c> otherwise</returns>
        private bool ValidateUiTemplateBeforeSave(out string invalidReason)
        {
            // TEST 1: Cannot save changes to the default template.
            if (CurrentUiTemplate.Name.Equals("Default", StringComparison.OrdinalIgnoreCase))
            {
                var htmlHasChanged   = !CurrentUiTemplate.HtmlTemplate.Equals(txtTemplate.Text, StringComparison.Ordinal);
                var scriptHasChanged = !CurrentUiTemplate.ScriptTemplate.Equals(txtScript.Text, StringComparison.Ordinal);

                if (htmlHasChanged || scriptHasChanged)
                {
                    invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Modify_Default_Tmpl_Msg;
                    return(false);
                }
            }

            // TEST 2: Verify no other template has the same name in this category.
            var tmpl = (from t in UiTemplates
                        where t.TemplateType == CurrentUiTemplate.TemplateType &&
                        t.GalleryId == GalleryId &&
                        t.Name == txtTemplateName.Text &&
                        t.UiTemplateId != CurrentUiTemplate.UiTemplateId
                        select t).FirstOrDefault();

            if (tmpl != null)
            {
                invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Save_Duplicate_Name_Msg;
                return(false);
            }

            // TEST 3: Verify user isn't removing the last template from the root album.
            var rootAlbumId = Factory.LoadRootAlbumInstance(GalleryId).Id;

            var curTmplNotAssignedToRootAlbum  = !tvUC.SelectedAlbumIds.Contains(rootAlbumId); // Need to use tvUC.SelectedAlbumIds instead of CurrentUiTemplate.RootAlbumIds because CurrentUiTemplate has not yet been unbound
            var noOtherTmplAssignedToRootAlbum = !UiTemplates.Any(t => t.TemplateType == CurrentUiTemplate.TemplateType && t.UiTemplateId != CurrentUiTemplate.UiTemplateId && t.RootAlbumIds.Contains(rootAlbumId));

            if (curTmplNotAssignedToRootAlbum && noOtherTmplAssignedToRootAlbum)
            {
                invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Save_No_Tmpl_Msg;
                return(false);
            }

            // TEST 4: The default template cannot be renamed to something else.
            if (CurrentUiTemplate.Name.Equals("Default", StringComparison.OrdinalIgnoreCase) && !txtTemplateName.Text.Equals("Default", StringComparison.OrdinalIgnoreCase))
            {
                invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Save_No_Default_Tmpl_Msg;
                return(false);
            }

            // All the tests pass, so return true.
            invalidReason = String.Empty;
            return(true);
        }
        /// <summary>
        /// Verify the UI template can be deleted.
        /// </summary>
        /// <param name="invalidReason">A message describing why the validation failed. Set to <see cref="String.Empty" /> when
        /// validation succeeds.</param>
        /// <returns><c>true</c> if business rules for deleting are satisfied, <c>false</c> otherwise</returns>
        private bool ValidateUiTemplateBeforeDelete(out string invalidReason)
        {
            // TEST 1: Cannot delete the default template.
            if (CurrentUiTemplate.Name.Equals("Default", StringComparison.OrdinalIgnoreCase))
            {
                invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Modify_Default_Tmpl_Msg;
                return(false);
            }

            // TEST 2: Cannot delete a template if it leaves one ore more albums without a template
            var rootAlbumId = Factory.LoadRootAlbumInstance(GalleryId).Id;
            var noOtherTmplAssignedToRootAlbum = !UiTemplates.Any(t => t.TemplateType == CurrentUiTemplate.TemplateType && t.UiTemplateId != CurrentUiTemplate.UiTemplateId && t.RootAlbumIds.Contains(rootAlbumId));

            if (noOtherTmplAssignedToRootAlbum)
            {
                invalidReason = Resources.GalleryServer.Admin_Templates_Cannot_Delete_No_Tmpl_Msg;
                return(false);
            }

            // All the tests pass, so return true.
            invalidReason = String.Empty;
            return(true);
        }