/// <summary>
        /// Processes media for a specified media folder
        /// </summary>
        /// <param name="uploadFolder">The upload folder to process media for</param>
        /// <param name="allMediaFolders">A list of all media folders</param>
        private void DoMediaProcessing(UploadFolder uploadFolder, IEnumerable<MediaFolder> allMediaFolders)
        {
            DirectoryInfo uploadDirectory;

            Uri uploadFolderUri = new Uri(FolderLocation.UploadFolder, uploadFolder.RelativePath);
            uploadDirectory = new DirectoryInfo(uploadFolderUri.LocalPath);

            FileInfo[] mediaInUploadFolder = uploadDirectory.GetFiles("*.*", SearchOption.TopDirectoryOnly);

            //get media folders corespodning to the upload folder
            IEnumerable<MediaFolder> mediaFoldersCorespondingToUploadFolders = allMediaFolders.Where(x => x.UploadFolderID == uploadFolder.UploadFolderID);

            //place new images into the upload folder remove processed images from the upload folder
            foreach (var mediaFolder in mediaFoldersCorespondingToUploadFolders)
            {
                Uri mediaFolderUri = new Uri(FolderLocation.UploadFolder, mediaFolder.RelativePath);
                ResizeSettings resizeSettings = null;

                if (mediaFolder.Property != null)
                {
                    resizeSettings = new ResizeSettings();

                    if (mediaFolder.Property.ImageWidth != null)
                    {
                        resizeSettings.MaxWidth = (int)mediaFolder.Property.ImageWidth;
                    }
                    if (mediaFolder.Property.ImageHeight != null)
                    {
                        resizeSettings.MaxHeight = (int)mediaFolder.Property.ImageHeight;
                    }
                    resizeSettings.Mode = FitMode.Max;
                    foreach (var mediaToProcess in mediaInUploadFolder)
                    {
                        ImageBuilder.Current.Build(mediaToProcess.FullName, mediaFolderUri.LocalPath + "\\" + mediaToProcess.Name, resizeSettings);
                    }
                }
                else
                {
                    foreach (var mediaToProcess in mediaInUploadFolder)
                    {
                        mediaToProcess.CopyTo(mediaFolderUri.LocalPath + "\\" + mediaToProcess.Name);
                    }
                }
            }
        }
        /// <summary>
        /// Creates a folder
        /// </summary>
        /// <param name="newMediaFolder">New folder to create</param>
        /// <param name="uploadFolder">The upload folder to upload to this folder (optional)</param>
        public void CreateFolder(MediaFolder newMediaFolder, UploadFolder uploadFolder = null)
        {
            //Uri mediaFolderPath = new Uri(HttpContext.Current.Server.MapPath("/ContentFolders"));
            //Uri uploadFolderPath = new Uri(HttpContext.Current.Server.MapPath("/UploadFolders"));
            DirectoryInfo newMediaFolderDirectoryInfo;
            DirectoryInfo newUploadFolderDirectoryInfo;

            if (newMediaFolder == null)
            {
                //todo log error and return
                return;
            }

            //Create the main directories if they do not currently exists
            try
            {
                if (!Directory.Exists(FolderLocation.ContentFolder.LocalPath))
                    Directory.CreateDirectory(FolderLocation.ContentFolder.LocalPath);

                if (!Directory.Exists(FolderLocation.UploadFolder.LocalPath))
                    Directory.CreateDirectory(FolderLocation.UploadFolder.LocalPath);
            }
            catch (Exception)
            {
                //todo log error
                throw;
            }

            try
            {
                //Create the new directory
                DirectoryInfo newMediaFolderDirectory = new DirectoryInfo(FolderLocation.ContentFolder.LocalPath);
                newMediaFolderDirectoryInfo = newMediaFolderDirectory.CreateSubdirectory(newMediaFolder.Name);
                newMediaFolder.RelativePath = FolderLocation.ContentFolder.MakeRelativeUri(new Uri(newMediaFolderDirectoryInfo.FullName)).ToString();
            }
            catch (Exception)
            {
                //todo log error
                throw;
            }

            if (newMediaFolder.UploadFolderID == 0)
            {
                if (uploadFolder != null)
                {
                    try
                    {
                        DirectoryInfo newUploadFolderDirectory = new DirectoryInfo(FolderLocation.UploadFolder.LocalPath);
                        newUploadFolderDirectoryInfo = newUploadFolderDirectory.CreateSubdirectory(uploadFolder.Name);
                        uploadFolder.RelativePath = FolderLocation.UploadFolder.MakeRelativeUri(new Uri(newUploadFolderDirectoryInfo.FullName)).ToString();
                        try
                        {
                            _mediaManagerContext.Entry(uploadFolder).State = EntityState.Added;
                            _mediaManagerContext.SaveChanges();

                            try
                            {
                                newMediaFolder.UploadFolderID = uploadFolder.UploadFolderID;
                            }
                            catch (Exception)
                            {
                                //todo log error
                                throw;
                            }
                        }
                        catch (Exception)
                        {
                            //todo log error
                            throw;
                        }
                    }
                    catch (Exception)
                    {
                        //todo log error
                        throw;
                    }
                }
            }

            try
            {
                _mediaManagerContext.Entry(newMediaFolder).State = EntityState.Added;
                _mediaManagerContext.SaveChanges();
            }
            catch (Exception)
            {
                //todo log error
                throw;
            }

            #region commented out
            //if (Directory.Exists(mainContentFolderPath) && Directory.Exists(mainUploadFolderPath))
            //{
            //	string newMediaFolderPath = HttpContext.Current.Server.MapPath("/ContentFolders/" + newMediaFolder.Name);
            //	DirectoryInfo mediaFolderDirectory = new DirectoryInfo(newMediaFolderPath);
            //	try
            //	{

            //	}
            //	catch (Exception)
            //	{

            //		throw;
            //	}
            //	if (newMediaFolder.UploadFolderID != 0)
            //	{
            //		string newUploadFolderPath = HttpContext.Current.Server.MapPath("/UploadFolders/" + uploadFolder.Name);
            //		DirectoryInfo uploadFolderDirectory = new DirectoryInfo(newUploadFolderPath);
            //	}
            //}
            //else
            //{
            //	try
            //	{
            //		if (!Directory.Exists(mainContentFolderPath))
            //			Directory.CreateDirectory(mainContentFolderPath);

            //		if (!Directory.Exists(mainUploadFolderPath))
            //			Directory.CreateDirectory(mainUploadFolderPath);
            //	}
            //	catch (Exception)
            //	{
            //		throw;
            //	}
            //}
            #endregion
        }
        public MediaFolder AddMediaFolder(MediaFolder mediaFolder)
        {
            DirectoryInfo newMediaFolderDirectoryInfo;
            DirectoryInfo newUploadFolderDirectoryInfo;
            MediaFolder existingMediaFolder;

            //Create the main directories if they do not currently exists
            try
            {
                if (!Directory.Exists(contentFolderURI.LocalPath))
                    Directory.CreateDirectory(contentFolderURI.LocalPath);

                if (!Directory.Exists(uploadFolderURI.LocalPath))
                    Directory.CreateDirectory(uploadFolderURI.LocalPath);
            }
            catch (Exception)
            {
                //todo log error
                throw;
            }

            DirectoryInfo newMediaFolderDirectory = new DirectoryInfo(contentFolderURI.LocalPath);
            newMediaFolderDirectoryInfo = newMediaFolderDirectory.CreateSubdirectory(mediaFolder.Name);

            //Check to see if a media folder with that name already exists
            existingMediaFolder = unitOfWork.MediaFolderRepository.GetFirst(x => x.Name.Equals(mediaFolder.Name, StringComparison.InvariantCulture));
            if (existingMediaFolder != null)
            {
                return existingMediaFolder;
            }

            if (mediaFolder.UploadFolderID == 0)
            {
                //create new upload folder
                UploadFolder uploadFolder = new UploadFolder();
                uploadFolder.Name = mediaFolder.UploadFolder.Name;
                DirectoryInfo newUploadFolderDirectory = new DirectoryInfo(uploadFolderURI.LocalPath);
                newUploadFolderDirectoryInfo = newUploadFolderDirectory.CreateSubdirectory(mediaFolder.UploadFolder.Name);
                uploadFolder.RelativePath = uploadFolderURI.MakeRelativeUri(new Uri(newUploadFolderDirectoryInfo.FullName)).ToString();
                //unitOfWork.UploadFolderRepository.Insert(uploadFolder);
                //unitOfWork.Save();
                //mediaFolder.UploadFolderID = uploadFolder.UploadFolderID;
                mediaFolder.UploadFolder = uploadFolder;
            }
            else
            {
                mediaFolder.UploadFolder = null;
            }

            //Create the new media directory
            mediaFolder.RelativePath = contentFolderURI.MakeRelativeUri(new Uri(newMediaFolderDirectoryInfo.FullName)).ToString();

            unitOfWork.MediaFolderRepository.Insert(mediaFolder);
            unitOfWork.Save();

            return mediaFolder;
        }
        /// <summary>
        /// Updates a folder
        /// </summary>
        /// <param name="mediaFolder">Media Folder to Update</param>
        /// <param name="uploadFolder">Upload Folder to Update (optional)</param>
        public void UpdateFolder(MediaFolder mediaFolder, UploadFolder uploadFolder = null)
        {
            DirectoryInfo newUploadFolderDirectoryInfo;

            if (mediaFolder == null || (mediaFolder.UploadFolderID == 0 && uploadFolder == null))
            {
                //todo log error and return
                return;
            }

            if (mediaFolder.UploadFolderID == 0)
            {
                try
                {
                    DirectoryInfo newUploadFolderDirectory = new DirectoryInfo(FolderLocation.UploadFolder.LocalPath);
                    newUploadFolderDirectoryInfo = newUploadFolderDirectory.CreateSubdirectory(uploadFolder.Name);
                    uploadFolder.RelativePath = FolderLocation.UploadFolder.MakeRelativeUri(new Uri(newUploadFolderDirectoryInfo.FullName)).ToString();
                    try
                    {
                        _mediaManagerContext.Entry(uploadFolder).State = EntityState.Added;
                        _mediaManagerContext.SaveChanges();

                        try
                        {
                            mediaFolder.UploadFolderID = uploadFolder.UploadFolderID;
                        }
                        catch (Exception)
                        {
                            //todo log error
                            throw;
                        }
                    }
                    catch (Exception)
                    {
                        //todo log error
                        throw;
                    }
                }
                catch (Exception)
                {
                    //todo log error
                    throw;
                }
            }

            try
            {
                _mediaManagerContext.Entry(mediaFolder).State = EntityState.Modified;
                _mediaManagerContext.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        Console.WriteLine("- property: \"{0}\", Error: \"{1}\"",
                            ve.PropertyName, ve.ErrorMessage);
                    }
                }
                throw;
            }
        }
        public MediaFolder UpdateMediaFolder(MediaFolder mediaFolder)
        {
            DirectoryInfo newUploadFolderDirectoryInfo;

            if (mediaFolder.UploadFolderID == 0)
            {
                //create new media folder
                UploadFolder uploadFolder = new UploadFolder();
                uploadFolder.Name = mediaFolder.UploadFolder.Name;
                DirectoryInfo newUploadFolderDirectory = new DirectoryInfo(uploadFolderURI.LocalPath);
                newUploadFolderDirectoryInfo = newUploadFolderDirectory.CreateSubdirectory(mediaFolder.UploadFolder.Name);
                uploadFolder.RelativePath = uploadFolderURI.MakeRelativeUri(new Uri(newUploadFolderDirectoryInfo.FullName)).ToString();
                //mediaFolder.UploadFolder = uploadFolder;
                unitOfWork.UploadFolderRepository.Insert(uploadFolder);
                mediaFolder.UploadFolderID = uploadFolder.UploadFolderID;
            }

            mediaFolder.UploadFolder = null;

            unitOfWork.MediaFolderRepository.Update(mediaFolder);
            unitOfWork.Save();

            return mediaFolder;
        }