protected static XElement SetRowSeats(SeatPattern seatPattern, SeatsOrder seatsOrder, string rowName,
            IEnumerable<DataRow> filteredSeats, XElement currentElement)
        {
            currentElement.SetAttributeValue("data-row", rowName);

            // TODO : Verify this is always true: what if rows shouldn't always be left o right
            currentElement.ReorderElements(OrderBy.MinX);

            var currentPathElement = currentElement.Descendants().First();

            var rowSeats = GetOrderedSeatsForRow(filteredSeats, rowName, seatsOrder);
            switch (seatPattern)
            {
                case SeatPattern.Odds:
                    rowSeats = rowSeats.Where(x => int.Parse(x["seat_num"].ToString())%2 != 0);
                    break;
                case SeatPattern.Even:
                    rowSeats = rowSeats.Where(x => int.Parse(x["seat_num"].ToString())%2 == 0);
                    break;
            }

            foreach (var seat in rowSeats)
            {
                currentPathElement = SetElementAndGetNext(currentPathElement, seat);
                if (currentPathElement == null) break;
            }

            currentElement = currentElement.ElementsAfterSelf().FirstOrDefault();
            return currentElement;
        }
 protected static IEnumerable<DataRow> GetOrderedSeatsForRow(IEnumerable<DataRow> seats, string row,
     SeatsOrder seatsOrder)
 {
     return seatsOrder == SeatsOrder.Ascending
         ? seats.Where(x => x["seat_row"].ToString().Trim() == row)
             .OrderBy(x => int.Parse(x["seat_num"].ToString()))
             .ToList()
         : seats.Where(x => x["seat_row"].ToString().Trim() == row)
             .OrderByDescending(x => int.Parse(x["seat_num"].ToString()))
             .ToList();
 }
        private void SetArea(XElement rootElement, string areaName, int startingSeatNumber, SeatsOrder seatsOrder)
        {
            var areaGElement = rootElement.Elements().Single(x => x.Attribute("data-area") != null && x.Attribute("data-area").Value == areaName);
            var rowGElements = areaGElement.Elements();

            foreach (var rowGElement in rowGElements)
            {
                var currentCircleElement = rowGElement.Elements().First();
                var currentSeatNumber = seatsOrder == SeatsOrder.Descending ? startingSeatNumber + rowGElement.Elements().Count()*2 - 2 : startingSeatNumber;
                
                while (currentCircleElement != null)
                {
                    //currentCircleElement.SetAttributeValue("data-row", );
                    currentCircleElement.SetAttributeValue("data-number", currentSeatNumber);
                    currentSeatNumber += seatsOrder == SeatsOrder.Descending ? -2 : 2;
                    currentCircleElement = currentCircleElement.ElementsAfterSelf().FirstOrDefault();
                }

            }
        }
 private static void SetOrchestraCircleSeatGroup(IEnumerable<DataRow> seats, XContainer root, string firstRow,
     string lastRow, SeatPattern seatPattern, ICollection<int> sections, int minSeat, int maxSeat,
     SeatsOrder seatsOrder)
 {
     var filteredSeats = GetSeatsBySectionsAndSeatNumberRange(seats, sections, minSeat, maxSeat).ToList();
     var currentElement = root.Elements().First();
     for (var c = firstRow[0]; c <= lastRow[0]; c++)
     {
         var actualRow = string.Format("{0}{0}{0}", c);
         currentElement = SetRowSeats(seatPattern, seatsOrder, actualRow, filteredSeats, currentElement);
         if (currentElement == null) break;
     }
 }
        protected static void SetStandardSeatGroup(IEnumerable<DataRow> seats, XContainer root, int firstRow,
           int lastRow, ICollection<int> excludedRows, SeatPattern seatPattern, ICollection<int> sections,
           int minSeat, int maxSeat, SeatsOrder seatsOrder)
        {
            var filteredSeats = GetSeatsBySectionsAndSeatNumberRange(seats, sections, minSeat, maxSeat).ToList();
            var currentElement = root.Elements().First();

            for (var c = firstRow; c <= lastRow; c++)
            {
                if (excludedRows != null && excludedRows.Contains(c)) continue;
                currentElement = SetRowSeats(seatPattern, seatsOrder, c.ToString(), filteredSeats, currentElement);
                if (currentElement == null) break;
            }
        }