HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/CMS/CMSAdminControls/UI/Selectors/TimeoutSelector.ascx.cs
using System;
using System.Web.UI.WebControls;
using System.Drawing;

using CMS.UIControls;
using CMS.Helpers;
using CMS.ExtendedControls;
using CMS.Scheduler;
using CMS.Base;

public partial class CMSAdminControls_UI_Selectors_TimeoutSelector : BaseSchedulingControl
{
    #region "Constants

    private const int QUANTITYMAXIMUM = 10000;

    #endregion


    #region "Variables"

    private string mDefaultPeriod = SchedulingHelper.PERIOD_MINUTE;

    private bool mAllowNoTimeout = true;

    #endregion


    #region "Properties"

    /// <summary>
    /// Indicates if control is used on a live site
    /// </summary>
    public override bool IsLiveSite
    {
        get
        {
            return base.IsLiveSite;
        }
        set
        {
            base.IsLiveSite = value;
            timePicker.IsLiveSite = value;
        }
    }


    /// <summary>
    /// Indicates whether no timeout can be selected.
    /// </summary>
    public bool AllowNoTimeout
    {
        get
        {
            return mAllowNoTimeout;
        }
        set
        {
            if (!value)
            {
                // Ensure "none" is not selected
                if (rbNoneMode.Checked)
                {
                    rbNoneMode.Checked = false;
                    rbIntervalMode.Checked = true;
                }
                rbNoneMode.Visible = false;
            }
            mAllowNoTimeout = value;
        }
    }


    /// <summary>
    /// Indicates whether timeout is enabled.
    /// </summary>
    public bool TimeoutEnabled
    {
        get
        {
            if (!AllowNoTimeout)
            {
                return true;
            }

            return !rbNoneMode.Checked;
        }
        set
        {
            if (AllowNoTimeout)
            {
                rbNoneMode.Checked = !value;
            }
        }
    }


    /// <summary>
    /// Timeout selection mode
    /// </summary>
    public override string Mode
    {
        get
        {
            if (rbDateMode.Checked)
            {
                return SchedulingHelper.PERIOD_ONCE;
            }
            else
            {
                return drpScale.SelectedValue;
            }
        }
    }


    /// <summary>
    /// Time unit used
    /// </summary>
    public override CMSDropDownList Period
    {
        get
        {
            return drpScale;
        }
    }


    /// <summary>
    /// Start date & time
    /// </summary>
    public override DateTimePicker StartTime
    {
        get
        {
            return dateTimePicker;
        }
    }


    /// <summary>
    /// Preferred next run date
    /// </summary>
    public override CMSDropDownList MonthDate
    {
        get
        {
            return drpNextDate;
        }
    }


    /// <summary>
    /// Preferred next run order
    /// </summary>
    public override CMSDropDownList MonthOrder
    {
        get
        {
            return drpNextOrder;
        }
    }


    /// <summary>
    /// Preferred next run day of week
    /// </summary>
    public override CMSDropDownList MonthDay
    {
        get
        {
            return drpNextDay;
        }
    }


    /// <summary>
    /// Default period. Allowed values: second, timesecond, minute, hour, day, week, month, once.
    /// </summary>
    public override string DefaultPeriod
    {
        get
        {
            return mDefaultPeriod;
        }
        set
        {
            switch (value.ToLowerCSafe())
            {
                case SchedulingHelper.PERIOD_DAY:
                    mDefaultPeriod = SchedulingHelper.PERIOD_DAY;
                    break;

                case SchedulingHelper.PERIOD_HOUR:
                    mDefaultPeriod = SchedulingHelper.PERIOD_HOUR;
                    break;

                case SchedulingHelper.PERIOD_MINUTE:
                    mDefaultPeriod = SchedulingHelper.PERIOD_MINUTE;
                    break;

                case SchedulingHelper.PERIOD_MONTH:
                    mDefaultPeriod = SchedulingHelper.PERIOD_MONTH;
                    break;

                case SchedulingHelper.PERIOD_YEAR:
                    mDefaultPeriod = SchedulingHelper.PERIOD_YEAR;
                    break;

                case SchedulingHelper.PERIOD_WEEK:
                    mDefaultPeriod = SchedulingHelper.PERIOD_WEEK;
                    break;

                default:
                    mDefaultPeriod = SchedulingHelper.PERIOD_MINUTE;
                    break;
            }
        }
    }


    /// <summary>
    /// For weeks, months and years quantity can be 0 if 'exactly' is not checked. Else quantity minimum is 1.
    /// </summary>
    private int QuantityLowerBound
    {
        get
        {
            string scale = drpScale.SelectedValue;
            if(cbSpecificTime.Checked && (scale == SchedulingHelper.PERIOD_DAY)){
                return 0;
            }
            if (!rbExactly.Checked && ((scale == SchedulingHelper.PERIOD_WEEK) || (scale == SchedulingHelper.PERIOD_MONTH) || (scale == SchedulingHelper.PERIOD_YEAR)))
            {
                return 0;
            }
            return 1;
        }
    }

    #endregion


    #region "Event handlers"

    protected void Page_Load(object sender, EventArgs e)
    {
        EnsureChildControls();
        CMSPage page = Page as CMSPage;
        if (page != null)
        {
            page.EnsureScriptManager();
        }

        if (!RequestHelper.IsPostBack())
        {
            SetupForm(TaskInterval);
        }
    }


    protected void drpScale_SelectedIndexChanged(object sender, EventArgs e)
    {
        ScaleChanged();
    }


    protected void rbMode_CheckedChanged(object sender, EventArgs e)
    {
        if (rbIntervalMode.Checked)
        {
            ShowIntervalPanel();
        }
        else if (rbDateMode.Checked)
        {

            ShowDatePanel();
        }
        else
        {
            HideAllPanels();
        }
    }


    protected void cbSpecificTime_CheckedChanged(object sender, EventArgs e)
    {
        timePicker.Visible = cbSpecificTime.Checked;
    }


    protected void rbNext_CheckedChanged(object sender, EventArgs e)
    {
        DateModeChanged();
    }


    protected void drpNextDate_DaysCountChanged(object sender, EventArgs e){
        SetMonthDays();
    }

    #endregion


    #region "Public methods"

    /// <summary>
    /// Creates schedule interval string.
    /// </summary>
    protected override string EncodeInterval()
    {
        if (!TimeoutEnabled)
        {
            return String.Empty;
        }

        TaskInterval ti = new TaskInterval();
        string result = string.Empty;

        try
        {
            ti.Period = Mode;

            if (Mode != SchedulingHelper.PERIOD_ONCE)
            {
                result = new Validator().NotEmpty(txtQuantity.Text, GetString("timeoutselector.quantity.errorempty")).IsInteger(txtQuantity.Text, String.Format(GetString("timeoutselector.quantity.wrongformat"), QUANTITYMAXIMUM)).Result;
                    if (String.IsNullOrEmpty(result))
                    {
                        int quantity = ValidationHelper.GetInteger(txtQuantity.Text, -1);
                        if ((quantity >= QuantityLowerBound) && (quantity <= QUANTITYMAXIMUM))
                        {
                            ti.Every = quantity;
                        }
                        else
                        {
                            txtQuantity.ForeColor = Color.Red;
                        }
                    }
            }
            if (String.IsNullOrEmpty(result))
            {
                switch (Mode)
                {
                    case SchedulingHelper.PERIOD_MINUTE:
                    case SchedulingHelper.PERIOD_HOUR:
                    case SchedulingHelper.PERIOD_DAY:
                        ti.BetweenStart = DateTime.MinValue;
                        ti.BetweenEnd = DateTime.MaxValue;

                        // Add all days to match the format
                        AddWeekDays(ti);
                        AddWeekEnd(ti);
                        break;

                    case SchedulingHelper.PERIOD_WEEK:
                        if (rbNextDay.Checked)
                        {
                            ti.Order = drpNextOrder.SelectedValue;
                            ti.Day = drpNextDay.SelectedValue;
                        }
                        break;

                    case SchedulingHelper.PERIOD_MONTH:
                        if (rbNextDate.Checked)
                        {
                            ti.Order = drpNextDate.SelectedValue;
                        }
                        else if (rbNextDay.Checked)
                        {
                            ti.Order = drpNextOrder.SelectedValue;
                            ti.Day = drpNextDay.SelectedValue;
                        }
                        break;

                    case SchedulingHelper.PERIOD_YEAR:
                        if (rbNextDate.Checked)
                        {
                            ti.Order = drpNextDateMonth.SelectedValue;
                            ti.Day = drpNextDate.SelectedValue;
                        }
                        break;

                    case SchedulingHelper.PERIOD_ONCE:
                        if (dateTimePicker.SelectedDateTime != DateTime.MinValue)
                        {
                            ti.StartTime = dateTimePicker.SelectedDateTime;                            
                        }
                        else
                        {
                            result = GetString("timeoutselector.errorinvaliddate");
                        }
                        break;
                }

                // Add specific time to start date
                if (String.IsNullOrEmpty(result) && cbSpecificTime.Visible && cbSpecificTime.Checked)
                {
                    //result = new Validator().NotEmpty(txtSpecificTimeHour.Text, GetString("timeoutselector.specifichour.errorempty")).IsInteger(txtSpecificTimeHour.Text, GetString("timeoutselector.specifichour.wrongformat")).NotEmpty(txtSpecificTimeMinute.Text, GetString("timeoutselector.specificminute.errorempty")).IsInteger(txtSpecificTimeMinute.Text, GetString("timeoutselector.specificminute.wrongformat")).Result;
                    if (timePicker.IsValid())
                    {
                        ti.StartTime = ti.StartTime.AddHours(timePicker.Time.Hour);
                        ti.StartTime = ti.StartTime.AddMinutes(timePicker.Time.Minute);

                        ti.UseSpecificTime = true;
                    }
                    else
                    {
                        result = timePicker.ErrorMessage;
                    }
                }
                else
                {
                    ti.UseSpecificTime = false;
                }
            }
        }
        catch(Exception ex)
        {
            ShowError(ex.Message);
            result = ex.Message;
            dateTimePicker.DateTimeTextBox.ForeColor = Color.Red;
        }

        if (!String.IsNullOrEmpty(result))
        { 
            AddError(result);
            return null;
        }

        WeekListChecked = true;

        return SchedulingHelper.EncodeInterval(ti);
    }

    #endregion


    #region "Protected methods"

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        // Control init
        dateTimePicker.DateTimeTextBox.ForeColor = Color.Black;
        txtQuantity.ForeColor = Color.Black;

        if (!RequestHelper.IsPostBack())
        {
            ControlInit();
        }
    }


    protected override void OnPeriodChangeInit()
    {
        if (rbIntervalMode.Checked)
        {
            ShowIntervalPanel();
            ScaleChanged();
        }
        else
        {
            ShowDatePanel();
        }
        timePicker.Visible = cbSpecificTime.Checked;
    }


    protected override void ControlInit()
    {
        base.ControlInit();

        SetMonths();
    }


    /// <summary>
    /// Sets form with values from the schedule interval string.
    /// </summary>
    /// <param name="interval">Schedule interval string</param>
    protected void SetupForm(TaskInterval interval)
    {
        EnsureChildControls();
        if (TimeoutEnabled || !AllowNoTimeout)
        {
            interval = interval ?? new TaskInterval();

            // Set period type
            if (interval.Period == SchedulingHelper.PERIOD_ONCE)
            {
                rbDateMode.Checked = true;
            }
            else
            {
                rbIntervalMode.Checked = true;
                drpScale.SelectedValue = interval.Period;
                OnPeriodChangeInit();
            }

            if (interval.UseSpecificTime)
            {
                cbSpecificTime.Checked = true;
                timePicker.Visible = true;

                timePicker.Time = interval.StartTime;
            }

            rbExactly.Checked = false;
            rbNextDay.Checked = false;
            rbNextDate.Checked = false;

            switch (Mode)
            {
                case SchedulingHelper.PERIOD_MINUTE:
                case SchedulingHelper.PERIOD_HOUR:
                case SchedulingHelper.PERIOD_DAY:
                    txtQuantity.Text = interval.Every.ToString();
                    break;

                case SchedulingHelper.PERIOD_WEEK:
                    txtQuantity.Text = interval.Every.ToString();

                    if (String.IsNullOrEmpty(interval.Day))
                    {
                        rbExactly.Checked = true;
                    }
                    else
                    {
                        drpNextDay.SelectedValue = interval.Day;
                        rbNextDay.Checked = true;
                    }
                    DateModeChanged();
                    break;

                case SchedulingHelper.PERIOD_MONTH:
                    txtQuantity.Text = interval.Every.ToString();

                    if (String.IsNullOrEmpty(interval.Order))
                    {
                        rbExactly.Checked = true;
                    }
                    else if (ValidationHelper.GetInteger(interval.Order, 0) != 0)
                    {
                        rbNextDate.Checked = true;
                        drpNextDate.SelectedValue = interval.Order;
                        DateModeChanged();
                    }
                    else
                    {
                        rbNextDay.Checked = true;
                        drpNextOrder.SelectedValue = interval.Order;
                        DateModeChanged();
                        drpNextDay.SelectedValue = interval.Day;
                    }
                    
                    break;

                case SchedulingHelper.PERIOD_YEAR:
                    txtQuantity.Text = interval.Every.ToString();
                    if (!String.IsNullOrEmpty(interval.Day) && !String.IsNullOrEmpty(interval.Order))
                    {
                        rbNextDate.Checked = true;
                        drpNextDateMonth.SelectedValue = interval.Order;
                        DateModeChanged();
                        drpNextDate.SelectedValue = interval.Day;
                    }
                    else
                    {
                        rbExactly.Checked = true;
                        DateModeChanged();
                    }
                    
                    break;

                case SchedulingHelper.PERIOD_ONCE:
                    ShowDatePanel();
                    dateTimePicker.SelectedDateTime = interval.StartTime;
                    break;
            }
        }
        else
        {
            HideAllPanels();
        }
    }


    protected override void SetPeriods()
    {
        ListItem[] li = new ListItem[6];
        li[0] = new ListItem(GetString("timeoutselector.minutes"), SchedulingHelper.PERIOD_MINUTE);
        li[1] = new ListItem(GetString("timeoutselector.hours"), SchedulingHelper.PERIOD_HOUR);
        li[2] = new ListItem(GetString("timeoutselector.days"), SchedulingHelper.PERIOD_DAY);
        li[3] = new ListItem(GetString("timeoutselector.weeks"), SchedulingHelper.PERIOD_WEEK);
        li[4] = new ListItem(GetString("timeoutselector.months"), SchedulingHelper.PERIOD_MONTH);
        li[5] = new ListItem(GetString("timeoutselector.years"), SchedulingHelper.PERIOD_YEAR);
        drpScale.Items.Clear();
        drpScale.Items.AddRange(li);
    }

    #endregion


    #region "Private methods"

    private void ScaleChanged()
    {
        switch (drpScale.SelectedValue)
        {
            case SchedulingHelper.PERIOD_MINUTE:
            case SchedulingHelper.PERIOD_HOUR:
                plcDateMode.Visible = false;
                plcSpecificTime.Visible = false;
                lblNextDateOfTheMonth.Visible = false;
                lblNextDayOfTheMonth.Visible = false;
                break;

            case SchedulingHelper.PERIOD_DAY:
                plcDateMode.Visible = false;
                plcSpecificTime.Visible = true;
                lblNextDateOfTheMonth.Visible = false;
                lblNextDayOfTheMonth.Visible = false;
                break;

            case SchedulingHelper.PERIOD_WEEK:
                plcDateMode.Visible = true;
                plcExactly.Visible = true;
                plcNextDate.Visible = false;
                plcNextDay.Visible = true;
                drpNextOrder.Visible = false;
                plcSpecificTime.Visible = true;
                lblNextDateOfTheMonth.Visible = false;
                lblNextDayOfTheMonth.Visible = false;

                // Date will disappear for week
                if (rbNextDate.Checked)
                {
                    rbExactly.Checked = true;
                    rbNextDate.Checked = false;
                }

                DateModeChanged();
                break;

            case SchedulingHelper.PERIOD_MONTH:
                plcDateMode.Visible = true;
                plcExactly.Visible = true;
                plcNextDate.Visible = true;
                rbNextDate.ResourceString = "timeoutselector.thenextday";
                pnlNextDateMonth.Visible = false;
                plcNextDay.Visible = true;
                drpNextOrder.Visible = true;
                plcSpecificTime.Visible = true;
                lblNextDateOfTheMonth.Visible = true;
                lblNextDayOfTheMonth.Visible = true;

                InitializeMonthDays(31, true);
                DateModeChanged();
                break;

            case SchedulingHelper.PERIOD_YEAR:
                plcDateMode.Visible = true;
                plcExactly.Visible = true;
                plcNextDate.Visible = true;
                rbNextDate.ResourceString = "timeoutselector.thenext";
                pnlNextDateMonth.Visible = true;
                plcNextDay.Visible = false;
                plcSpecificTime.Visible = true;
                lblNextDateOfTheMonth.Visible = false;
                lblNextDayOfTheMonth.Visible = false;

                // Day will disappear for year
                if (rbNextDay.Checked)
                {
                    rbNextDay.Checked = false;
                    rbExactly.Checked = true;
                }
                DateModeChanged();
                break;
        }

        drpNextDate.SelectedIndex = 0;
        drpNextOrder.SelectedIndex = 0;
        drpNextDay.SelectedIndex = 0;
    }


    private void ShowIntervalPanel()
    {
        plcDate.Visible = false;
        plcInterval.Visible = true;

        ScaleChanged();
    }


    private void ShowDatePanel()
    {
        plcDate.Visible = true;
        plcSpecificTime.Visible = true;
        plcInterval.Visible = false;
    }


    private void HideAllPanels()
    {
        plcDate.Visible = false;
        plcInterval.Visible = false;
        plcSpecificTime.Visible = false;
    }


    private void DateModeChanged()
    {
        if (rbNextDate.Checked)
        {
            rbExactly.Checked = false;
            drpNextDate.Enabled = true;
            drpNextDateMonth.Enabled = true;
            drpNextOrder.Enabled = false;
            drpNextDay.Enabled = false;
            SetMonthDays();
        }
        else if (rbNextDay.Checked)
        {
            rbExactly.Checked = false;
            drpNextDate.Enabled = false;
            drpNextDateMonth.Enabled = false;
            drpNextOrder.Enabled = true;
            drpNextDay.Enabled = true;
        }
        else
        {
            rbExactly.Checked = true;
            drpNextDate.Enabled = false;
            drpNextDateMonth.Enabled = false;
            drpNextOrder.Enabled = false;
            drpNextDay.Enabled = false;
        }
    }


    private void SetMonths()
    {
        ListItem[] li = new ListItem[12];
        li[0] = new ListItem(GetString("general.january"), "1");
        li[1] = new ListItem(GetString("general.february"), "2");
        li[2] = new ListItem(GetString("general.march"), "3");
        li[3] = new ListItem(GetString("general.april"), "4");
        li[4] = new ListItem(GetString("general.may"), "5");
        li[5] = new ListItem(GetString("general.june"), "6");
        li[6] = new ListItem(GetString("general.july"), "7");
        li[7] = new ListItem(GetString("general.august"), "8");
        li[8] = new ListItem(GetString("general.september"), "9");
        li[9] = new ListItem(GetString("general.october"), "10");
        li[10] = new ListItem(GetString("general.november"), "11");
        li[11] = new ListItem(GetString("general.december"), "12");
        drpNextDateMonth.Items.Clear();
        drpNextDateMonth.Items.AddRange(li);
    }


    private void SetMonthDays()
    {
        if (drpScale.SelectedValue == SchedulingHelper.PERIOD_YEAR)
        {
            // 2012 is a leap year
            int days = DateTime.DaysInMonth(2012, ValidationHelper.GetInteger(drpNextDateMonth.SelectedValue, 0));
            InitializeMonthDays(days, false);
        }
    }

    #endregion
}