protected void gvTaskParameters_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            ParameterEditor txtValue = (ParameterEditor)e.Row.FindControl("txtValue");

            if (txtValue == null)
            {
                return;
            }

            ScheduleTaskParameterInfo prm = (ScheduleTaskParameterInfo)e.Row.DataItem;

            txtValue.DataType     = prm.DataTypeId;
            txtValue.DefaultValue = prm.DefaultValue;
            txtValue.Value        = prm.ParameterValue;
        }
        private void SaveTask()
        {
            // gather form parameters
            ScheduleInfo sc = new ScheduleInfo();

            sc.ScheduleId   = PanelRequest.ScheduleID;
            sc.ScheduleName = txtTaskName.Text.Trim();
            sc.TaskId       = ddlTaskType.SelectedValue;

            sc.PackageId = PanelSecurity.PackageId;

            sc.ScheduleTypeId = ddlSchedule.SelectedValue;
            sc.FromTime       = timeFromTime.SelectedValue;
            sc.ToTime         = timeToTime.SelectedValue;

            sc.StartTime = timeStartTime.SelectedValue;
            sc.Interval  = intInterval.Interval;

            // check maximum interval
            // load context
            PackageContext cntx = PackagesHelper.GetCachedPackageContext(PackageId);

            if (cntx.Quotas.ContainsKey(Quotas.OS_MINIMUMTASKINTERVAL))
            {
                int minInterval = cntx.Quotas[Quotas.OS_MINIMUMTASKINTERVAL].QuotaAllocatedValue;
                if (minInterval != -1 && sc.Interval < (minInterval * 60))
                {
                    sc.Interval = (minInterval * 60);
                }
            }

            // run once
            if (ddlSchedule.SelectedIndex == 3)
            {
                DateTime tm        = timeStartTime.SelectedValue;
                DateTime dt        = DateTime.Parse(txtStartDate.Text);
                DateTime startTime = new DateTime(dt.Year, dt.Month, dt.Day, tm.Hour, tm.Minute, tm.Second);
                sc.StartTime = startTime;
            }

            sc.WeekMonthDay = Utils.ParseInt(txtWeekDay.Text, 0);
            if (ddlSchedule.SelectedIndex == 2)
            {
                sc.WeekMonthDay = Utils.ParseInt(txtMonthDay.Text, 0);
            }


            sc.Enabled          = chkEnabled.Checked;
            sc.PriorityId       = ddlPriority.SelectedValue;
            sc.HistoriesNumber  = 0;
            sc.MaxExecutionTime = intMaxExecutionTime.Interval;

            // gather parameters
            List <ScheduleTaskParameterInfo> parameters = new List <ScheduleTaskParameterInfo>();

            foreach (GridViewRow row in gvTaskParameters.Rows)
            {
                ParameterEditor txtValue = (ParameterEditor)row.FindControl("txtValue");
                if (txtValue == null)
                {
                    continue;
                }

                string prmId = (string)gvTaskParameters.DataKeys[row.RowIndex][0];

                ScheduleTaskParameterInfo parameter = new ScheduleTaskParameterInfo();
                parameter.ParameterId    = prmId;
                parameter.ParameterValue = txtValue.Value;
                parameters.Add(parameter);
            }

            sc.Parameters = parameters.ToArray();

            // Gather parameters from view.
            if (this.configurationView != null)
            {
                sc.Parameters = this.configurationView.GetParameters();
            }

            // save
            if (PanelRequest.ScheduleID == 0)
            {
                // add new schedule
                try
                {
                    int result = ES.Services.Scheduler.AddSchedule(sc);
                    if (result < 0)
                    {
                        ShowResultMessage(result);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    ShowErrorMessage("SCHEDULE_ADD_TASK", ex);
                    return;
                }
            }
            else
            {
                // update existing
                try
                {
                    int result = ES.Services.Scheduler.UpdateSchedule(sc);
                    if (result < 0)
                    {
                        ShowResultMessage(result);
                        return;
                    }
                }
                catch (Exception ex)
                {
                    ShowErrorMessage("SCHEDULE_UPDATE_TASK", ex);
                    return;
                }
            }

            // redirect
            RedirectSpaceHomePage();
        }