/// <summary>
        /// Gets the image link.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns></returns>
        public static string GetAlbumImageThumbnailForUserHomepage(Album album)
        {
            string val = string.Empty;

            if (album.Media != null)
            {
                MediaFile thumbnail = album.Media[0].GetImageByPhotoType(PhotoType.Thumbnail);
                const string linkFormat = @"<tr>
                                                <td><span class=""imagecontainer"" ><a class=""showimage"" href=""{0}"" title=""{1}""><img src=""{2}"" alt=""{3}"" /></a></span></td>
                                                <td>
                                                    <ul class=""albummetadata"" >
                                                        <li><label class=""albumtitle"" ><span>{4}</span></label></li>
                                                        <li><label>photos </label><span>{5}</span></li>
                                                        <li><label>sub albums </label><span>{6}</span></li>
                                                    </ul>
                                                </td>
                                            </tr>";
                val = string.Format(linkFormat,
                    _urlService.UserUrl(album.Media[0].Owner.Username, string.Format("albums/#/show/{0}", album.AlbumId)),
                    album.Name,
                    _urlService.UserUrl(album.Media[0].Owner.Username, "services/grayscale/" + thumbnail.MediaId),
                    album.Media[0].Title,
                    album.Name, album.PhotoCount, album.ChildAlbumCount);
            }
            return val;
        }
        public ActionResult Add(Album album)
        {
            AddAlbumView addAlbumView = ModelFactory<AddAlbumView>();

            if (album != null)
            {
                addAlbumView.AlbumCrumbs = GetAlbumCrumbs(album);
            }

            return View(addAlbumView);
        }
        public ActionResult Add(AddAlbumView albumView, string id)
        {
            int albumId;
            int.TryParse(id, out albumId);

            Album album = new Album { Description = albumView.Description ?? string.Empty, Name = albumView.Name, UserId = Owner.Id };
            albumView = SetAuthorizationAndUrlService(albumView);

            if (!string.IsNullOrEmpty(id))
            {
                album.ParentId = Convert.ToInt32(id);
            }

            _albumRepository.Save(album);
            albumView.UIMessage = album.Name + " added.";

            albumView.Name = string.Empty;
            albumView.Description = string.Empty;

            return View(albumView);
        }
 /// <summary>
 /// Gets from album view.
 /// </summary>
 /// <param name="album">The album.</param>
 /// <returns></returns>
 private RemovePhotosFromAlbumView GetFromAlbumView(Album album)
 {
     List<Media> photos = _mediaRepository.RetrieveByAlbumIdAndUserId(Owner.Id, album.AlbumId);
     RemovePhotosFromAlbumView removePhotos = ModelFactory<RemovePhotosFromAlbumView>(new {photos, album});
     return removePhotos;
 }
        /// <summary>
        /// Gets the bread crumbs.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns></returns>
        private IDictionary<string, string> GetBreadCrumbs(Album album)
        {
            IDictionary<string, string> breadCrumbs = GetBreadCrumbs();
            breadCrumbs.Add(album.Name, UrlService.UserUrl("albums/#/show/" + album.AlbumId));
            breadCrumbs.Add("add", string.Empty);

            return breadCrumbs;
        }
        /// <summary>
        /// Gets the album view.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <param name="cp">The cp.</param>
        /// <param name="text">The text.</param>
        /// <param name="retrieveMedia">The retrieve media.</param>
        /// <returns></returns>
        private BySearchingView GetAlbumView(Album album, string cp, Func<List<Media>> retrieveMedia, string text = null)
        {
            BySearchingView albumView = ModelFactory<BySearchingView>(new {album, Pagination = _paginationService});

            int index = (string.IsNullOrEmpty(cp) ? 1 : Convert.ToInt32(cp));
            List<Media> media = retrieveMedia();
            string queryText = (string.IsNullOrEmpty(text) ? string.Empty : "text=" + HttpUtility.HtmlEncode(text));
            albumView.Pagination.GeneratePaging(media, index, 20, "?" + queryText + "&cp={0}");
            albumView.TotalCount = media.Count;

            return albumView;
        }
        /// <summary>
        /// Gets the album crumbs.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns></returns>
        private string GetAlbumCrumbs(Album album)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("/");
            List<Album> albumCrumb = _albumRepository.RetrieveAlbumHierarchyByAlbumIdAndUserId(album.AlbumId, Owner.Id);
            const string link = "<a href=\"{0}\" title=\" View '{1}'\" >{1}</a>";
            foreach (Album crumb in albumCrumb)
            {
                builder.AppendFormat("/ {0} ", string.Format(link, UrlService.UserUrl("albums/#/show/" + crumb.AlbumId), crumb.Name));
            }

            return builder.ToString();
        }
        /// <summary>
        /// Add photos by the tags.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <param name="text">The text.</param>
        /// <param name="cp">The cp.</param>
        /// <returns></returns>
        public ActionResult Tags(Album album, string text, string cp)
        {
            IDictionary<string, string> breadCrumbs = GetBreadCrumbs(album);
            breadCrumbs.Add("by tags", string.Empty );

            List<Media> media = (string.IsNullOrEmpty(text)
                                     ? new List<Media>()
                                     : _mediaRepository.SearchTagsForPhotosThatDoNotIncludePhotosFromAlbumIdAndUserId(album.AlbumId, Owner.Id, new TagCollection(text)));

            Func<List<Media>> retrieveMedia = () => (media);

            BySearchingView albumView = GetAlbumView(album, cp, retrieveMedia, text);
            albumView.PartialViewName = "ByTags";
            albumView.Set = _persistentCollectionService.Set(Authorization.Owner.Username + "AddPhotoTag" + album.AlbumId + text, media, Persistence.Temporary);
            string queryValues = (string.IsNullOrEmpty(text) ? string.Empty : "?text=" + HttpUtility.HtmlEncode(text).Trim() + "&cp=" + (string.IsNullOrEmpty(cp) ? 1 : Convert.ToInt32(cp)));
            _persistentCollectionService.SetBackUrl(Authorization.Owner.Username + "/albums/tags/" + album.AlbumId + queryValues, SiteCookie);

            return View("addphotos",albumView, breadCrumbs);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="AlbumLandingPageDecorator"/> class.
 /// </summary>
 /// <param name="album">The album.</param>
 public AlbumLandingPageDecorator(Album album)
 {
     Album = album;
 }
 public ActionResult RemovePhotos(Album album)
 {
     RemovePhotosFromAlbumView fromAlbumView = GetFromAlbumView(album);
     IDictionary<string, string> crumbs = GetRemovePhotoBreadcrumbs(album.AlbumId);
     return View(fromAlbumView, crumbs);
 }
        /// <summary>
        /// Manages the specified id.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns></returns>
        public ActionResult Photos(Album album)
        {
            List<MediaWithAlbumPosition> media = _mediaRepository.GetMediaWithAlbumPositionByAlbumId(album.AlbumId, Owner.Id);
            string albumCrumbs = GetAlbumCrumbs(album);

            IDictionary<string, string> breadCrumbs = GetBreadCrumbs();
            breadCrumbs.Add(album.Name, string.Empty);
            breadCrumbs.Add("photos", string.Empty);

            string setKey = _persistentCollectionService.Set(Authorization.Owner.Username + "_ManageAlbum_" + album.AlbumId, media.ConvertAll(o => (Media)o), Persistence.Permanent);
            _persistentCollectionService.SetBackUrl(Authorization.Owner.Username + "/albums/photos/" + album.AlbumId, SiteCookie);

            ManagePhotosView manageView = ModelFactory<ManagePhotosView>(new {album, media, albumCrumbs, Set=setKey});
            return View(manageView, breadCrumbs);
        }
        /// <summary>
        /// Albums the details.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns></returns>
        public JsonResult GetDetails(Album album)
        {
            List<Media> medias = _mediaRepository.RetrieveByAlbumIdAndUserId(Owner.Id, album.AlbumId);
            _persistentCollectionService.SetBackUrl(string.Format("{0}/albums/#/show/{1}", Authorization.Owner.Username, album.AlbumId), SiteCookie);
            string key = _persistentCollectionService.Set(Authorization.Owner.Username + "_albums_show_" + album.AlbumId, medias, Persistence.Permanent);

            string adminLink = string.Empty;
            if (Authorization.IsOwner)
            {
                adminLink = GetAdminLink(album.AlbumId);
            }

            string photos = GenerateImageLinks(key,medias);

            var albumDetails = new { photos, title = album.Name, isAdmin = Authorization.IsOwner, description = album.Description, count = medias.Count, adminlinks = adminLink };
            return Json(albumDetails, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Details(Album album, string name, string description)
        {
            ManageDetailsView manageView = ModelFactory<ManageDetailsView>();
            album.Description = description ?? string.Empty;
            album.Name = name;
            _albumRepository.Save(album);

            IDictionary<string, string> breadCrumbs = GetBreadCrumbs();
            breadCrumbs.Add(album.Name, UrlService.UserUrl("albums/#/show/" + album.AlbumId));
            breadCrumbs.Add("details", string.Empty);

            manageView.Album = album;
            manageView.AlbumCrumbs = GetAlbumCrumbs(album);
            manageView.UIMessage =  album.Name + " saved.";

            return View(manageView, breadCrumbs);
        }
        public ActionResult Details(Album album)
        {
            string albumCrumbs = GetAlbumCrumbs(album);
            IDictionary<string, string> breadCrumbs = GetBreadCrumbs();
            breadCrumbs.Add(album.Name, UrlService.UserUrl("albums/#/show/" + album.AlbumId));
            breadCrumbs.Add("details", string.Empty);

            string message = SiteCookie.Get(_removePhotosFromAlbumMessageCookieKey);

            if (!string.IsNullOrEmpty(message))
            {
                SiteCookie.Set(_removePhotosFromAlbumMessageCookieKey, string.Empty);
            }

            Media media = null;

            if(album.CoverMediaId.HasValue)
            {
                media = _mediaRepository.RetrieveByPrimaryKeyAndUserId(album.CoverMediaId.GetValueOrDefault(), Owner.Id);
            }

            ManageDetailsView manageView = ModelFactory<ManageDetailsView>(new{ Album = album, CoverMedia = media, albumCrumbs, UIMessage = message});
            return View(manageView, breadCrumbs);
        }
        public ActionResult All(Album album, string cp)
        {
            IDictionary<string, string> breadCrumbs = GetBreadCrumbs(album);
            breadCrumbs.Add("viewing all", string.Empty);
            List<Media> media = _mediaRepository.RetrievePhotosThatDoNotIncludePhotosFromAlbumIdAndUserId(album.AlbumId, Owner.Id);

            Func<List<Media>> retrieveMedia = () => (media);
            BySearchingView albumView = GetAlbumView(album, cp, retrieveMedia);

            albumView.Set = _persistentCollectionService.Set(Authorization.Owner.Username + "_AddPhotosAll_" + album.AlbumId, media, Persistence.Permanent);
            _persistentCollectionService.SetBackUrl(Authorization.Owner.Username + "/albums/addphotos/" + album.AlbumId, SiteCookie);

            albumView.PartialViewName = "All";
            return View(albumView, breadCrumbs);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="AlbumDecorator"/> class.
 /// </summary>
 /// <param name="album">The album.</param>
 public AlbumDecorator(Album album)
 {
     Album = album;
 }
 public void Save(Album album)
 {
     string procedure = ((album.AlbumId < 1) ? "Album_Insert" : "Album_Update");
     database.NonQuery(procedure, album);
 }
        public ActionResult RemovePhotos(Album album, int[] ids)
        {
            string message = string.Empty;

            if (ids != null)
            {
                _albumRepository.DeletePhotosFromAlbum(album.AlbumId, ids);
                message = string.Format("{0} photo(s) removed.", ids.Length);
            }

            RemovePhotosFromAlbumView fromAlbumView = GetFromAlbumView(album);
            IDictionary<string, string> crumbs = GetRemovePhotoBreadcrumbs(album.AlbumId);
            fromAlbumView.UIMessage = message;

            return View(fromAlbumView, crumbs);
        }