public static IEnumerable <Image> GetSpecialDestinations()
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                var imagesExtracted = (from destination in entity.Destinations.Where(x => x.IsSpecial == true)
                                       from image in entity.Images.Where(a => a.DestinationID == destination.DestinationID && a.Description != null)
                                       from attraction in entity.Attractions.Where(a => a.AttractionID == image.AttractionID)
                                       select new
                {
                    Description = image.Description,
                    DestinationTitle = destination.Title,
                    AttractionTitle = attraction.Title,
                    Author = image.Author,
                    ImageURL = domainURL + image.FolderName.Trim() + "/2000x1125/" + image.ImageURL,
                    DestinationID = image.DestinationID
                }).ToList().Take(5);

                var imagesToReturn = (from imageData in imagesExtracted
                                      select new Image()
                {
                    Description = imageData.Description,
                    ImageURL = imageData.ImageURL,
                    Title = imageData.DestinationTitle + " - " + imageData.AttractionTitle,
                    DestinationID = imageData.DestinationID
                }
                                      ).AsEnumerable();

                return(imagesToReturn);
            }
        }
        public static string GetDestinationDefaultImage(int id, char size)
        {
            TripXpertEntities entity     = new TripXpertEntities();
            string            sizeString = "138x138";

            switch (size)
            {
            case 'M':
                sizeString = "/320x320/";
                break;

            case 'S':
                sizeString = "/138x138/";
                break;

            case 'L':
                sizeString = "/2000x1125/";
                break;

            default:
                break;
            }

            using (entity)
            {
                Image defaultImage = (from image in entity.Images
                                      where image.DestinationID == id && image.AttractionID != null
                                      select image).ToList().First();

                return(String.Format("{0}{1}{2}{3}", domainURL, defaultImage.FolderName.Trim(), sizeString, defaultImage.ImageURL));
            }
        }
        public static object GetAllDestinationImages(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                var matchingImages = (from image in entity.Images
                                      where image.DestinationID == id
                                      select new
                {
                    Title = image.Title,
                    Description = (image.Author != string.Empty)?"Photo by: " + image.Author:string.Empty,
                    ImageURL = image.ImageURL,
                    FolderName = image.FolderName
                }).ToList();

                var imagesToReturn = (from matchingImage in matchingImages
                                      select new
                {
                    Title = matchingImage.Title,
                    Description = matchingImage.Description,
                    ImageURL = domainURL + matchingImage.FolderName.Trim() + "/2000x1125/" + matchingImage.ImageURL,
                    ThumbnailURL = domainURL + matchingImage.FolderName.Trim() + "/138x138/" + matchingImage.ImageURL
                });
                return(imagesToReturn);
            }
        }
        public static object GetAllDestinationImages(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return(entity.Images.Where(x => x.DestinationID == id).ToList());
            }
        }
        public static DateTime?GetLatestDate(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((DateTime?)GetTourInfos(id).Max(x => x.StartDate));
            }
        }
        public static List <Destination> GetAllDestinations()
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return(entity.Destinations.ToList());
            }
        }
        public static List <Destination> GetFirstDestinations()
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                var destinations = (from destionation in entity.Destinations select destionation).Take(3).ToList();
                return(destinations);
            }
        }
        public static Testimonial GetTestimonial(int testimonialID)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from testimonial in entity.Testimonials
                        where testimonial.ID == testimonialID
                        select testimonial).First());
            }
        }
        public static List <DestinationMarker> GetMarkers(int destinationID)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from marker in entity.DestinationMarkers
                        where marker.DestinationID == destinationID
                        select marker).ToList());
            }
        }
        public static List <Attraction> GetAttactionsForDestionation(int destinationID)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from attraction in entity.Attractions
                        where attraction.DestinationID == destinationID
                        select attraction).ToList());
            }
        }
        public static List <TourInfo> GetTourInfos(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from tourInfo in entity.TourInfos
                        where tourInfo.DestinationID == id
                        select tourInfo).ToList());
            }
        }
        public static List <Destination> GetDestinationsByIds(List <int> ids)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                var destinations = (from destination in entity.Destinations
                                    where ids.Contains(destination.DestinationID)
                                    select destination).ToList();
                return(destinations);
            }
        }
        public static string GetDestinationDefaultImage(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                Image defaultImage = (from image in entity.Images
                                      where image.DestinationID == id
                                      select image).ToList().First();

                return(String.Format("{0}{1}/{2}", domainURL, defaultImage.FolderName.Trim(), defaultImage.ImageURL));
            }
        }
        public static Destination GetDestinationById(string id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                int         destinationID = int.Parse(id);
                Destination dest          = (from destination in entity.Destinations
                                             where destination.DestinationID == destinationID
                                             select destination).First();
                return(dest);
            }
        }
        public static object GetAllAttractionImages()
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from image in entity.Images
                        where image.AttractionID != null
                        select new
                {
                    ImageURL = domainURL + image.FolderName.Trim() + "/138x138/" + image.ImageURL
                }).ToList());
            }
        }
        public static Image GetAttractionImage(int attractionID)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                Image attractionImage = (from image in entity.Images
                                         where image.AttractionID == attractionID
                                         select image).ToList().First();
                attractionImage.ImageURL = String.Format("{0}{1}/{2}", domainURL, attractionImage.FolderName.Trim(), attractionImage.ImageURL);

                return(attractionImage);
            }
        }
        public static object GetMapData(int destinationID)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                return((from marker in entity.DestinationMarkers
                        where marker.DestinationID == destinationID
                        select new
                {
                    Longitude = marker.Longitude,
                    Latitude = marker.Latitude,
                    Shape = "pinTarget"
                }).ToList());
            }
        }
        public static int GetLowestPriceForDestination(int id, int?min, int?max)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                if (min.HasValue && max.HasValue)
                {
                    return((int)GetTourInfos(id).Where(t => t.PerSingleOccupancy > min.Value && t.PerSingleOccupancy < max.Value).First().PerSingleOccupancy);
                }
                else
                {
                    return((int)GetTourInfos(id).Min(x => x.PerSingleOccupancy));
                }
            }
        }
        public static string GetDestinationDetailImage(int id)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                var rnd          = new Random();
                var detailImages = (from image in entity.Images
                                    where image.DestinationID == id
                                    select image).ToList();
                int randomIndex = rnd.Next(detailImages.Count);
                var detailImage = detailImages[randomIndex];

                return(String.Format("{0}{1}/{2}", domainURL, detailImage.FolderName.Trim(), detailImage.ImageURL));
            }
        }
        public static object GetFullDestinationInfo()
        {
            Dictionary <string, List <object> > dataDictionary = new Dictionary <string, List <object> >();
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                List <Destination> destinations = GetAllDestinations();
                foreach (Destination destination in destinations)
                {
                    dataDictionary.Add(destination.Title, new List <object>());
                    dataDictionary[destination.Title].Add(GetLowestPriceForDestination(destination.DestinationID, null, null).ToString());
                    dataDictionary[destination.Title].Add(destination.IsSpecial);
                    dataDictionary[destination.Title].Add(destination.DestinationID);
                }
                return(dataDictionary);
            }
        }
        public static string GetDestinationsQueryString(string title, string typeOfOffer, string priceRange)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                string[] prices = priceRange.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                int?     id     = null;
                if (title != string.Empty)
                {
                    id = (from destination in entity.Destinations
                          where destination.Title.Contains(title)
                          select destination.DestinationID).First();
                    return(id.ToString());
                }

                IEnumerable <TourInfo> infos        = entity.TourInfos.ToList();
                List <Destination>     destinations = (from destination
                                                       in entity.Destinations
                                                       select destination).ToList();

                if (prices.Length > 1)
                {
                    int lowestPrice  = int.Parse(prices[0]);
                    int highestPrice = int.Parse(prices[1]);
                    infos        = infos.Where(i => i.PerSingleOccupancy > lowestPrice && i.PerSingleOccupancy < highestPrice);
                    destinations = GetDestinationsByIds(infos.Select(x => x.DestinationID).Distinct().ToList());
                }
                if (typeOfOffer != "All")
                {
                    bool isSpecial = (typeOfOffer == "Special")?true:false;
                    destinations = destinations.Where(x => x.IsSpecial == isSpecial).ToList();
                }
                StringBuilder sb = new StringBuilder();
                sb.Append(destinations[0].DestinationID.ToString());
                for (int i = 1; i < destinations.Count; i++)
                {
                    sb.Append(",");
                    sb.Append(destinations[i].DestinationID.ToString());
                }
                return(sb.ToString());
            }
        }
        public static object GetFullAttractionInfo(string url)
        {
            TripXpertEntities entity = new TripXpertEntities();

            using (entity)
            {
                Image attractionImage = (from image in entity.Images.Where(a => a.ImageURL == url) select image).First();
                var   data            = (from attraction in entity.Attractions.Where(x => x.AttractionID == attractionImage.AttractionID)
                                         from destination in entity.Destinations.Where(a => a.DestinationID == attraction.DestinationID)
                                         select new
                {
                    DestinationTitle = destination.Title,
                    ImageURL = domainURL + attractionImage.FolderName.Trim() + "/320x320/" + attractionImage.ImageURL,
                    Location = attraction.Location,
                    Description = attraction.Description,
                    AttractionTitle = attraction.Title,
                    DestinationID = destination.DestinationID
                }).ToList();
                return(data);
            }
        }