/// <summary>
 /// Initializes a new instance of the <see cref="TvServerEventArgs"/> class.
 /// </summary>
 /// <param name="eventType">Type of the event.</param>
 /// <param name="card">The card.</param>
 /// <param name="user">The user.</param>
 /// <param name="conflict">The conflict.</param>
 public TvServerEventArgs(TvServerEventType eventType, VirtualCard card, User user, Conflict conflict)
 {
   _eventType = eventType;
   _card = card;
   _user = user;
   _channel = channel;
   _conflict = conflict;
 }
    /// <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 assignedShedule in cardSchedules[cardno[card.IdCard]])
            {
              if (schedule.IsOverlapping(assignedShedule))
              {
                if (!(schedule.isSameTransponder(assignedShedule) && card.supportSubChannels))
                {
                  free = false;
                  //_overlap = true;
                  lastOverlappingSchedule = assignedShedule;
                  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;
    }