private void loadPeriods()
        {
            using (var rep = new Lib.Repositories.PeriodRepository(this.ActiveUser))
            {
                var periods = rep.getAll();

                if (periods != null && periods.Count > 0)
                {

                    var list = periods.OrderBy(p => p.InitialDate).ToList().Select(p => new
                    {
                        IdCrypt = Commons.SecurityUtils.criptografar(p.Id.ToString()),
                        Name = p.Open ? String.Format("{0} (Aberto)", String.Format(Resources.Label.list_item_period_label, p.Name, p.InitialDate, p.FinalDate)) : String.Format(Resources.Label.list_item_period_label, p.Name, p.InitialDate, p.FinalDate),
                        Open = p.Open
                    }).ToList();

                    ddlPeriods.DataSource = list;
                    ddlPeriods.DataBind();

                    var periodOpen = list.Where(a => a.Open == true).FirstOrDefault();

                    if (periodOpen != null)
                        ddlPeriods.SelectedIndex = list.IndexOf(periodOpen);
                }
                else
                {
                    ddlPeriods.Items.Add(new ListItem(Resources.Message.no_period_has_found, ""));
                }
            }
        }
        public override void ProcessRequest(HttpContext context)
        {
            try
            {
                if (!userAuthenticate())
                {
                    throw new Exception(Resources.Message.user_not_allowed);
                }

                List<Lib.Entities.Period> periods = null;
                JavaScriptSerializer serializer = new JavaScriptSerializer();

                var initialDate = String.IsNullOrEmpty(context.Request.Form["id"]) ? DateTime.MinValue : DateTime.Parse(context.Request.Form["id"], new System.Globalization.CultureInfo("pt-BR"));
                var finalDate = String.IsNullOrEmpty(context.Request.Form["fd"]) ? DateTime.MaxValue : DateTime.Parse(context.Request.Form["fd"], new System.Globalization.CultureInfo("pt-BR"));
                var t = context.Request.Form["ut"].Split(",".ToCharArray());

                bool open = t.Contains("open") ? true : false;
                bool closed = t.Contains("closed") ? true : false;

                using (Lib.Repositories.PeriodRepository rep = new Lib.Repositories.PeriodRepository(this.ActiveUser))
                {
                    periods = rep.selectWhere(f => f.InitialDate >= initialDate && f.FinalDate <= finalDate);
                }

                if (!open)
                {
                    periods = periods.Where(f => f.Open == false).ToList();
                }

                if (!closed)
                {
                    periods = periods.Where(f => f.Open == true).ToList();
                }

                var result = periods.OrderBy(p=>p.FinalDate).Select(period => new
                {
                    Id = Commons.SecurityUtils.criptografar(period.Id.ToString()),
                    IdEncoded = HttpUtility.UrlEncode(Commons.SecurityUtils.criptografar(period.Id.ToString())),
                    Name = period.Name,
                    FinalDate = period.FinalDate.ToString("dd/MM/yyyy"),
                    InitialDate = period.InitialDate.ToString("dd/MM/yyyy"),
                    Open = period.Open,
                    Published = period.Published,
                    CanPublish = period.IsThereOneOrMoreResponseFormAccepted,
                    ActiveUserType = this.ActiveUser.UserTypeEnum.ToString(),
                    InitialConvocationDate = period.ConvocationInitialDate.ToString("dd/MM/yyyy"),
                    FinalConvocationDate = period.ConvocationFinalDate.ToString("dd/MM/yyyy")
                }).ToList();

                context.Response.ContentType = "application/json";
                context.Response.Write(serializer.Serialize(result));
            }
            catch (Exception ex)
            {
                Lib.Log.ErrorLog.saveError("Web.Handler.User.GetAll.ProcessRequest", ex);
                context.Response.StatusCode = 500;
                context.Response.Write(String.Format(Resources.Message.unknow_error, ex.Message));
            }
        }
        protected void btnSave_Click(object sender, EventArgs e)
        {
            var cult = new System.Globalization.CultureInfo("pt-BR");

            long periodId = 0;
            phMessageError.Visible = false;
            phMessageSuccess.Visible = false;
            lblMessageError.Text = String.Empty;
            lblMessageSuccess.Text = String.Empty;

            Lib.Entities.Period p = new Lib.Entities.Period();
            p.ConvocationInitialDate = DateTime.Parse(txtConvocationInitialDate.Text, cult);
            p.ConvocationFinalDate = DateTime.Parse(txtConvocationFinalDate.Text, cult);
            p.FinalDate = DateTime.Parse(txtFinalDate.Text, cult);
            p.InitialDate = DateTime.Parse(txtInitialDate.Text, cult);
            p.Name = txtName.Text;
            p.Open = chkAberto.Checked;

            if (!String.IsNullOrEmpty(hdnPeriodId.Value))
            {
                periodId = Convert.ToInt64(Commons.SecurityUtils.descriptografar(hdnPeriodId.Value));

                p.Id = periodId;
            }

            using (Lib.Repositories.PeriodRepository repository = new Lib.Repositories.PeriodRepository(this.ActiveUser))
            {
                repository.save(p);

                if (repository.HasErrors)
                {
                    phMessageError.Visible = true;
                    lblMessageError.Text = String.Join(",", repository.Errors);
                }
                else
                {
                    phMessageSuccess.Visible = true;
                    if (periodId == 0)
                    {

                        lblMessageSuccess.Text = String.Format("Período '{0}' foi criado com sucesso!", txtName.Text);
                    }
                    else
                    {
                        lblMessageSuccess.Text = String.Format("Período '{0}' foi atualizado com sucesso!", txtName.Text);
                    }

                    Response.Redirect("~/Period/List.aspx");
                }
            }
        }
        public override void ProcessRequest(HttpContext context)
        {
            try
            {
                var periodIdString = context.Request.Form["Id"];
                long periodId = 0;
                long.TryParse(Commons.SecurityUtils.descriptografar(periodIdString), out periodId);

                if (periodId > 0)
                {
                    using (Lib.Repositories.PeriodRepository repository = new Lib.Repositories.PeriodRepository(this.ActiveUser))
                    {
                        var period = repository.getInstanceById(periodId);

                        if (period != null)
                        {
                            period.Published = true;
                            period.Open = false;

                            repository.save(period);
                        }
                        else
                        {
                            throw new Exception(Resources.Message.period_not_found);
                        }
                    }
                }
                else
                {
                    throw new Exception(Resources.Message.period_id_not_found);
                }

                context.Response.ContentType = "text/plain";
                context.Response.Write("Ok");
            }
            catch (Exception ex)
            {
                Lib.Log.ErrorLog.saveError("Web.Handler.ResponseForm.Action.ProcessRequest", ex);
                context.Response.StatusCode = 500;
                context.Response.Write(Resources.Message.couldnt_process_request);
            }
        }
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            //Precisa estar aqui, pois a atualização do periodo acontece após o Page_Load e depois atualiza o período.
            phPeriodOpen.Visible = false;
            using (Lib.Repositories.PeriodRepository rep = new Lib.Repositories.PeriodRepository(this.BasePage.ActiveUser))
            {
                var period = rep.getPeriodOpen();

                if (period != null)
                {
                    linkToRequestCities.NavigateUrl = String.Format("/City/RequestCities.aspx?periodId={0}", HttpUtility.UrlEncode(Commons.SecurityUtils.criptografar(period.Id.ToString())));
                    linkToOpenForms.NavigateUrl = String.Format("/Form/ListResponseForm.aspx?periodId={0}", HttpUtility.UrlEncode(Commons.SecurityUtils.criptografar(period.Id.ToString())));
                    menu_period_period.Text = String.Format(Resources.Label.menu_period, period.FinalDate.ToString("dd/MM/yyyy"));
                    phPeriodOpen.Visible = true;
                }
                else
                {
                    menu_period_period.Text = String.Format(Resources.Label.menu_period, "");
                }
            }
        }
        //private void loadRequestCities(long cityId, long periodId)
        //{
        //    using (Lib.Repositories.UserRepository ctx = new Lib.Repositories.UserRepository(this.ActiveUser))
        //    {
        //        var listPendingRequests = ctx.getAllRequestsFromCity(cityId, periodId);
        //        listPendingRequests.Select(l=>l.
        //    }
        //}
        private void loadPeriodInformation(Lib.Entities.City city)
        {
            phOpenPeriodInformation.Visible = false;
            using (Lib.Repositories.PeriodRepository ctx = new Lib.Repositories.PeriodRepository(this.ActiveUser))
            {
                var periodOpen = ctx.getPeriodOpen();

                if (periodOpen != null)
                {
                    ltOpenPeriodTitle.Text = String.Format("Responsáveis e colaboradores no período ({0})", periodOpen.Name);
                    hdOpenPeriodId.Value = Commons.SecurityUtils.criptografar(periodOpen.Id.ToString());
                    phOpenPeriodInformation.Visible = true;

                    if (city != null)
                    {
                        //Recupera o grupo da cidade e periodo selecionado
                        var group = city.Groups.Where(g => g.PeriodId == periodOpen.Id).FirstOrDefault();

                        if (group != null)
                        {
                            var list = group.Collaborators.Select(c => new
                            {
                                Id = c.Id,
                                Name = c.Name
                            }).ToList();

                            JavaScriptSerializer js = new JavaScriptSerializer();
                            hdCurrentCollabsJson.Value = js.Serialize(list);

                            hdCollabValues.Value = String.Join(",", list.Select(i => i.Id).ToList());
                            hdCurrentCollabs.Value = hdCollabValues.Value;

                            if (group.Responsable != null)
                            {
                                ddlResponsable.SelectedValue = group.ResponsableId.ToString();
                            }
                        }

                        //loadRequestCities(city.Id, periodOpen.Id);
                    }
                }
            }
        }
        private void verifyWarnings()
        {
            using (Lib.Repositories.PeriodRepository rep = new Lib.Repositories.PeriodRepository(this.ActiveUser))
            {
                var periodOpen = rep.getPeriodOpen();
                DateTime lastDate = DateTime.MinValue;

                var allPeriods = rep.getAll();
                if (allPeriods.Count > 0)
                {
                    lastDate = allPeriods.Max(p => p.FinalDate);
                }

                if (periodOpen != null)
                {
                    phMessageWarning.Visible = true;
                    ltMessageWarning.Text = String.Format(Resources.Message.exists_an_open_period_from_to, periodOpen.InitialDate, periodOpen.FinalDate);
                }

                if (lastDate != DateTime.MinValue)
                {
                    phMessageWarning2.Visible = true;
                    ltMessageWarning2.Text = String.Format(Resources.Message.need_create_period_from, lastDate);
                }
            }
        }
        private void loadForm()
        {
            using (Lib.Repositories.PeriodRepository rep = new Lib.Repositories.PeriodRepository(this.ActiveUser))
            {
                hdnPeriodId.Value = Page.Request.QueryString["id"];
                long periodId = Convert.ToInt64(Commons.SecurityUtils.descriptografar(hdnPeriodId.Value));

                var period = rep.getInstanceById(periodId);
                txtName.Text = period.Name;
                txtFinalDate.Text = period.FinalDate.ToString("dd/MM/yyyy");
                txtInitialDate.Text = period.InitialDate.ToString("dd/MM/yyyy");
                txtConvocationInitialDate.Text = period.ConvocationInitialDate.ToString("dd/MM/yyyy");
                txtConvocationFinalDate.Text = period.ConvocationFinalDate.ToString("dd/MM/yyyy");

                txtName.Enabled = false;
                //txtInitialDate.Enabled = false;

                chkAberto.Checked = period.Open;
            }
        }