private void PopulateDataList(PollChoice[] choices)
        {
            DataTable dtChoices = new DataTable();
            dtChoices.Columns.Add("ID");
            dtChoices.Columns.Add("Number");
            dtChoices.Columns.Add("ChoiceValue");

            if (choices == null || choices.Length == 0)
            {
                for (var i=0; i<10;++i)
                {
                    dtChoices.Rows.Add(new object[] { 0, i + 1, String.Empty });
                }
            }
            else
            {
                for (var i=0; i<choices.Length; ++i)
                {
                    dtChoices.Rows.Add(new object[] {choices[i].ID, i + 1, choices[i].Answer});
                }

                for (var i = choices.Length; i < 10; ++i)
                {
                    dtChoices.Rows.Add(new object[] { 0, i + 1, String.Empty });
                }
            }

            dlChoices.DataSource = dtChoices;
            dlChoices.DataBind();
        }
        protected void btnSave_Click(object sender, EventArgs e)
        {
            if (!HasWriteAccess)
                return;

            if (txtQuestion.Text.Trim().Length == 0)
            {
                MessageBox.Show("The question text field must not be empty!".TranslateA(),
                    Misc.MessageType.Error);
                return;
            }

            int nonEmptyTextFields = 0;
            foreach (DataListItem item in dlChoices.Items)
            {
                TextBox txtChoiceValue = (TextBox)item.FindControl("txtChoiceValue");
                if (txtChoiceValue.Text.Trim().Length > 0)
                    nonEmptyTextFields++;
            }

            if (nonEmptyTextFields < 2)
            {
                MessageBox.Show("The question must have at least 2 possible answers!".TranslateA(),
                    Misc.MessageType.Error);
                return;
            }

            if (dpToDate.SelectedDate.Date < dpFromDate.SelectedDate.Date)
            {
                MessageBox.Show("End Date must be posterior to Start Date!".Translate(),
                    Misc.MessageType.Error);
                return;                
            }

            if (dpShowResultsUntil.SelectedDate.Date < dpToDate.SelectedDate.Date)
            {
                MessageBox.Show("Show Results Until date must be greater than or equal to End Date!".Translate(),
                    Misc.MessageType.Error);
                return;
            }

            Poll poll;
            int pollID;
            if (!Int32.TryParse(ddPolls.SelectedValue, out pollID))
                return;

            if (pollID == -1)
            {
                poll = new Poll(txtQuestion.Text);
                poll.StartDate = dpFromDate.SelectedDate;
                poll.EndDate = dpToDate.SelectedDate;
                poll.ShowResultsUntil = dpShowResultsUntil.SelectedDate;
                poll.Save();
                ddPolls.Items.Add(new ListItem(txtQuestion.Text, poll.ID.ToString()));
                ddPolls.SelectedValue = poll.ID.ToString();
            }
            else
            {
                poll = Poll.Fetch(pollID);

                if (poll == null)
                    return;

                ddPolls.SelectedItem.Text = txtQuestion.Text;
                poll.Title = txtQuestion.Text;
                poll.StartDate = dpFromDate.SelectedDate;
                poll.EndDate = dpToDate.SelectedDate;
                poll.ShowResultsUntil = dpShowResultsUntil.SelectedDate;
                poll.Save();
            }

            foreach (DataListItem item in dlChoices.Items)
            {
                TextBox txtChoiceValue = (TextBox)item.FindControl("txtChoiceValue");
                HiddenField hidID = (HiddenField)item.FindControl("hidID");

                int id;
                if (Int32.TryParse(hidID.Value, out id))
                {
                    if (id > 0)
                    {
                        PollChoice choice = PollChoice.Fetch(id);
                        if (choice != null)
                        {
                            if (txtChoiceValue.Text.Trim().Length > 0)
                            {
                                choice.Answer = txtChoiceValue.Text;
                                choice.Save();
                            }
                            else
                            {
                                PollChoice.Delete(id);
                            }
                        }
                    }
                    else if (id == 0 && txtChoiceValue.Text.Trim().Length > 0)
                    {
                        PollChoice choice = 
                            new PollChoice(poll.ID, txtChoiceValue.Text);

                        choice.Save();
                    }
                }
            }

            var newChoices = PollChoice.FetchByPollID(poll.ID);
            PopulateDataList(newChoices);

            MessageBox.Show("The poll has been saved successfully!".TranslateA(), Misc.MessageType.Success);
        }