/// <summary>
        /// Calculoes the specified c.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <returns>System.Int32.</returns>
        private int Calculo(Conferencia c)
        {
            int erro      = 0;
            int x         = ZERO;
            int limiteSup = c.Fim.DayOfYear - 1;
            int limiteInf = c.Inicio.DayOfYear - 1;

            //senao coloca a conferencia no seu devido lugar
            for (int i = limiteInf; i <= limiteSup; i++)
            {
                for (x = ZERO; x < MAXHIGH; x++)
                {
                    if (TemEstaConferenciaNoArray(c, i))
                    {
                        break;
                    }
                    if (null == conferenciasAno[i, x])
                    {   //a variavel erro está a funcionar como contador
                        erro++;
                        break;
                    }
                }
            }
            return(erro);
        }
        /// <summary>
        /// Sees all sessoes.
        /// </summary>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool SeeAllConferencias( )
        {
            int lenght = 0;

            Conferencia[] todasConferencia = new Conferencia[totConferencias];

            for (int i = 0; i < MAXSIZE; i++)
            {
                for (int x = 0; x < MAXHIGH; x++)
                {
                    if (this.conferenciasAno[i, x] == null)
                    {
                        ;
                    }
                    else
                    {
                        if (todasConferencia.Contains(conferenciasAno[i, x]))
                        {
                            ;
                        }

                        else
                        {
                            todasConferencia[lenght++] = conferenciasAno[i, x];
                        }
                    }
                }
            }

            return(true);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="OrganizadorConferencias" /> class.
 /// </summary>
 /// <param name="c">The c.</param>
 /// <param name="nome">The nome.</param>
 public OrganizadorConferencias(Conferencia c, string nome = "Investe")
 {
     this.conferenciasAno        = new Conferencia[MAXSIZE, MAXHIGH];
     this.totConferencias        = ZERO;
     this.listaNomesConferencias = new string[MAXSIZE * MAXHIGH];
     this.nome = nome;
     listaNomesConferencias[this.totConferencias++] = c.Nome;
     conferenciasAno[c.Inicio.DayOfYear - 1, ZERO]  = c;
 }
        /// <summary>
        /// Tems the conferencia number dia.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <param name="valor">The valor.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool TemEstaConferenciaNoArray(Conferencia c, int valor)
        {
            for (int i = 0; i < MAXHIGH; i++)
            {
                if (conferenciasAno[valor, i] == c)
                {
                    return(true);
                }
            }


            return(false);
        }
        /// <summary>
        /// Procuras the na lista.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool ProcuraNaLista(Conferencia c)
        {
            int comp = listaNomesConferencias.Length;

            for (int i = 0; i < comp; i++)
            {
                if (listaNomesConferencias[i] == c.Nome)
                {
                    return(true);
                }
            }

            return(false);
        }
        /// <summary>
        /// Apagas the conferencia.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool ApagaConferencia(Conferencia c)
        {
            if (ProcuraNaLista(c))
            {
                int posicao;
                int diaIni = c.Inicio.DayOfYear - 1;
                int diaFim = c.Fim.DayOfYear - 1;

                for (int i = diaIni; i <= diaFim; i++)
                {
                    for (int x = 0; x < MAXHIGH; x++)
                    {
                        if (Search(c, out posicao))
                        {
                            if (x + 1 == MAXHIGH)
                            {
                                conferenciasAno[i, x] = null;
                            }
                            else
                            {
                                conferenciasAno[i, x] = conferenciasAno[i, x + 1];
                            }
                        }
                    }
                }

                SortAll();
                for (int i = 0; i < MAXHIGH * MAXSIZE; i++)
                {
                    if (this.listaNomesConferencias[i] == c.Nome || this.listaNomesConferencias[i] == null)
                    {
                        if (this.listaNomesConferencias[i] == null)
                        {
                            break;
                        }

                        this.totConferencias--;
                        break;
                    }
                }

                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Searches the specified c.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <param name="posicao">The posicao.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool Search(Conferencia c, out int posicao)
        {
            // Ou podemos fazer um simples for na lista.
            posicao = -1;
            int diaIni = c.Inicio.DayOfYear - 1;
            int diaFim = c.Fim.DayOfYear - 1;

            for (int i = diaIni; i <= diaFim; i++)
            {
                for (int x = 0; x < MAXHIGH; x++)
                {
                    if (conferenciasAno[i, x] == c)
                    {
                        posicao = x;
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Searches the name of the conferencia by.
        /// </summary>
        /// <param name="s">The s.</param>
        /// <param name="nomeConferencia">The nome conferencia.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool SearchConferenciaByName(out Conferencia s, string nomeConferencia)
        {
            s = new Conferencia();

            if (nomeConferencia == null || totConferencias == 0)
            {
                return(false);
            }

            for (int i = 0; i < MAXSIZE; i++)
            {
                for (int x = 0; x < MAXHIGH; x++)
                {
                    if (this.conferenciasAno[i, x] != null && nomeConferencia == this.conferenciasAno[i, x].Nome)
                    {
                        s = conferenciasAno[i, x];
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Tems the conferencia number dia.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool TemEstaConferencia(Conferencia c)
        {
            if (totConferencias == ZERO)
            {
                ;
            }
            else if (null == conferenciasAno[c.Inicio.DayOfYear - 1, ZERO])
            {
                ;
            }

            else
            {
                for (int i = 0; i < MAXHIGH; i++)
                {
                    if (conferenciasAno[c.Inicio.DayOfYear - 1, i] == c)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
        //Uma conferencia pode ter uma pausa. Exemplo começa dia 1 - 12 - 2015 e acaba dia 5 - 12 -2015 no dia 4 pode não haver eventos.

        /*
         *  Todos os ciclos serão aqui colocados
         */

        /// <summary>
        /// Defines the entry point of the application.
        /// </summary>
        /// <param name="args">The arguments.</param>
        static void Main(string[] args)
        {
            #region Vars

            int opcaoMenu    = -1;
            int opcaoSubMenu = -1;


            OrganizadorConferencias organizador  = new OrganizadorConferencias();
            Conferencia             conferencia  = new Conferencia(DateTime.Parse("29-12-2015"), DateTime.Parse("30-12-2015"), "Work");
            Conferencia             conferenciaU = new Conferencia(DateTime.Parse("29-12-2015"), DateTime.Parse("30-12-2015"), "Work1");
            Conferencia             conferenciaI = new Conferencia(DateTime.Parse("29-12-2015"), DateTime.Parse("30-12-2015"), "Work2");
            Conferencia             conferenciaO = new Conferencia(DateTime.Parse("29-12-2015"), DateTime.Parse("30-12-2015"), "Work3");
            Conferencia             conferenciaP = new Conferencia(DateTime.Parse("29-12-2015"), DateTime.Parse("31-12-2015"), "Work4");
            Sessao sessao  = new Sessao(1, DateTime.Parse("30-12-2015"), DateTime.Parse("30-12-2015"));
            Artigo artigo  = new Artigo("Programar");
            Pessoa pessoa  = new Pessoa(34, "Luis", TipoPessoa.autor, 1);
            Pessoa pessoaU = new Pessoa(21, "Parente", TipoPessoa.convidado, 2);
            Pessoa pessoaI = new Pessoa(70, "Patente", TipoPessoa.convidado, 3);
            Pessoa pessoaP = new Pessoa(70, "Patente", TipoPessoa.convidado, 3);

            #endregion

            #region Body

            do
            {
                RecebeOpcaoMenu(out opcaoMenu);

                switch (opcaoMenu)
                {
                    #region 1

                case 1:
                    do
                    {
                        Console.Clear();
                        organizador.EscreveProprio();

                        RecebeOpcaoSubMenu(out opcaoSubMenu);
                    } while (opcaoSubMenu != 0);

                    break;

                    #endregion

                    #region 2

                case 2:
                    do
                    {
                        Console.Clear();
                        conferencia.EscreveProprio();
                        ComoCorreu(organizador.InsereConferenciaoAno(conferencia));
                        ComoCorreu(organizador.InsereConferenciaoAno(conferenciaU));
                        ComoCorreu(organizador.InsereConferenciaoAno(conferenciaI));
                        ComoCorreu(organizador.InsereConferenciaoAno(conferenciaO));
                        ComoCorreu(organizador.InsereConferenciaoAno(conferenciaP));
                        organizador.SeeAllConferencias();


                        RecebeOpcaoSubMenu(out opcaoSubMenu);
                    } while (opcaoSubMenu != 0);

                    break;

                    #endregion

                    #region 3

                case 3:
                    do
                    {
                        Console.Clear();
                        sessao.EscreveProprio();
                        ComoCorreu(conferencia.AddSessoes(sessao));

                        RecebeOpcaoSubMenu(out opcaoSubMenu);
                    } while (opcaoSubMenu != 0);

                    break;

                    #endregion

                    #region 4

                case 4:
                    do
                    {
                        Console.Clear();
                        artigo.EscreveProprio();
                        ComoCorreu(sessao.AddArtigo(artigo));

                        RecebeOpcaoSubMenu(out opcaoSubMenu);
                    } while (opcaoSubMenu != 0);

                    break;

                    #endregion

                    #region 5

                case 5:
                    do
                    {
                        Console.Clear();
                        ComoCorreu(artigo.AddPessoa(pessoa));
                        ComoCorreu(artigo.AddPessoa(pessoaU));
                        ComoCorreu(artigo.AddPessoa(pessoaI));
                        ComoCorreu(artigo.AddPessoa(pessoaP));
                        pessoa.EscreveProprio();

                        RecebeOpcaoSubMenu(out opcaoSubMenu);
                    } while (opcaoSubMenu != 0);

                    break;

                    #endregion

                    #region 0

                case 0:
                    Environment.Exit(0);

                    break;

                    #endregion

                    #region Default

                default:
                    Console.WriteLine("\nNot Found ");

                    break;

                    #endregion
                }
            } while (true);

            #endregion
        }
 /// <summary>
 /// Compares the conferencia.
 /// </summary>
 /// <param name="sU">The s u.</param>
 /// <param name="sD">The s d.</param>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 public static bool CompareConferencia(Conferencia sU, Conferencia sD)
 {
     return(sU == sD);
 }
 /// <summary>
 /// Escreves the conferencia.
 /// </summary>
 /// <param name="c">The c.</param>
 public void EscreveConferencia(Conferencia c)
 {
     Console.WriteLine(c.ToString());
 }
        /// <summary>
        /// Inseres the conferenciao ano.
        /// </summary>
        /// <param name="c">The c.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public bool InsereConferenciaoAno(Conferencia c)
        {
            int erro             = 0;
            int colocadaPrimeira = 0;
            int x = ZERO;

            if (c == null)
            {
                return(false);
            }

            else
            {
                int limiteSup       = c.Fim.DayOfYear - 1;
                int limiteInf       = c.Inicio.DayOfYear - 1;
                int primeiraPosicao = -1;

                erro = Calculo(c);

                //existe um ou mais dias que acontece o evento
                if (erro == (limiteSup - limiteInf) || erro >= 1)
                {
                    erro = 0;
                    for (int i = limiteInf; i <= limiteSup; i++)
                    {
                        for (x = ZERO; x < MAXHIGH; x++)
                        {
                            //é o limite superior
                            if (i == limiteSup)
                            {
                                //é a primeira vez que passa aqui?
                                if (primeiraPosicao == -1)
                                {
                                    primeiraPosicao = x;
                                }

                                //é nulo a posicao onde estamos ?
                                if (null == conferenciasAno[i, x])
                                {
                                    erro = 1;
                                    conferenciasAno[i, x] = c;
                                    break;
                                }

                                // é a ultima vez que vai passar aqui?
                                if (erro == 0 && (x + 1 == MAXHIGH))
                                {
                                    Conferencia newC = c;
                                    newC.Fim -= TimeSpan.Parse("1");
                                    if (newC.Inicio > newC.Fim)
                                    {
                                        ApagaConferencia(c);
                                        break;
                                    }

                                    ApagaConferencia(c);
                                    if (InsereConferenciaoAno(newC))
                                    {
                                        return(true);
                                    }
                                }
                            }
                            else
                            {
                                //é nulo a posicao onde estamos ?
                                if (null == conferenciasAno[i, x])
                                {
                                    //já foi inserida a conferencia nesse dia?
                                    if (TemEstaConferenciaNoArray(c, i))
                                    {
                                        break;
                                    }

                                    else
                                    {
                                        if (primeiraPosicao == -1)
                                        {
                                            primeiraPosicao = x;
                                        }

                                        conferenciasAno[i, x] = c;
                                        break;
                                    }
                                }

                                if (i == limiteInf && x + 1 == MAXHIGH && colocadaPrimeira == 0)
                                {
                                    Conferencia newC = c;
                                    newC.Inicio += TimeSpan.Parse("1");
                                    if (newC.Inicio > newC.Fim)
                                    {
                                        ApagaConferencia(c);
                                        break;
                                    }

                                    ApagaConferencia(c);
                                    if (InsereConferenciaoAno(newC))
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                    listaNomesConferencias[totConferencias++] = conferenciasAno[c.Inicio.DayOfYear - 1, primeiraPosicao].Nome;

                    return(true);
                }
            }
            return(false);
        }