/// <summary>Assign all schedules to cards</summary>
        /// <param name="Schedules">An IList containing all scheduled recordings</param>
        /// <returns>Array of List<Schedule> : one per card, index [0] contains unassigned schedules</returns>
        private List <Schedule>[] AssignSchedulesToCards(IList <Schedule> Schedules)
        {
            IList <Card> cardsList = Card.ListAllEnabled();

            // creates an array of Schedule Lists
            // element [0] will be filled with conflicting schedules
            // element [x] will be filled with the schedules assigned to card with idcard=x
            List <Schedule>[] cardSchedules = new List <Schedule> [cardsList.Count + 1];
            for (int i = 0; i < cardsList.Count + 1; i++)
            {
                cardSchedules[i] = new List <Schedule>();
            }

            #region assigns schedules from table

            //
            Dictionary <int, int> cardno = new Dictionary <int, int>();
            int n = 1;
            foreach (Card _card in _cards)
            {
                cardno.Add(_card.IdCard, n);
                n++;
            }
            //
            foreach (Schedule schedule in Schedules)
            {
                bool     assigned = false;
                Schedule lastOverlappingSchedule = null;
                int      lastBusyCard            = 0;
                bool     overlap = false;

                foreach (Card card in cardsList)
                {
                    if (card.canViewTvChannel(schedule.IdChannel))
                    {
                        // checks if any schedule assigned to this cards overlaps current parsed schedule
                        bool free = true;
                        foreach (Schedule assignedSchedule in cardSchedules[cardno[card.IdCard]])
                        {
                            if (schedule.IsOverlapping(assignedSchedule))
                            {
                                bool _isSameTransponder = (cmLayer.isSameTransponder(schedule, assignedSchedule) && card.supportSubChannels);
                                if (!_isSameTransponder)
                                {
                                    free = false;
                                    //_overlap = true;
                                    lastOverlappingSchedule = assignedSchedule;
                                    lastBusyCard            = card.IdCard;
                                    break;
                                }
                            }
                        }
                        if (free)
                        {
                            cardSchedules[cardno[card.IdCard]].Add(schedule);
                            assigned = true;
                            break;
                        }
                    }
                }
                if (!assigned)
                {
                    cardSchedules[0].Add(schedule);
                    Conflict newConflict =
                        new Conflict(schedule.IdSchedule, lastOverlappingSchedule.IdSchedule, schedule.IdChannel, schedule.StartTime);
                    newConflict.IdCard = lastBusyCard;
                    newConflict.Persist();

                    Program prg = Program.RetrieveByTitleTimesAndChannel(schedule.ProgramName, schedule.StartTime,
                                                                         schedule.EndTime, schedule.IdChannel);

                    if (prg != null)
                    {
                        prg.HasConflict = true;
                        prg.Persist();
                        _conflictingPrograms.Add(prg);
                    }
                }
            }

            #endregion

            return(cardSchedules);
        }