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/CMSModules/Ecommerce/FormControls/CheckoutProcess.ascx.cs
using System;
using System.Data;
using System.Linq;
using System.Xml;

using CMS.EcommerceProvider;
using CMS.FormControls;
using CMS.Helpers;
using CMS.Base;
using CMS.ExtendedControls;
using CMS.UIControls;


/// <summary>
/// Checkout definition update event handler.
/// </summary>
public delegate void OnCheckoutProcessDefinitionUpdateEventHandler(string action);


public partial class CMSModules_Ecommerce_FormControls_CheckoutProcess : FormEngineUserControl
{
    #region "Variables"

    private string mImageFolder = "";
    private CheckoutProcessInfo mCheckoutProcess;
    private int mStepOrder = 1;
    private string breadcrumbsText;

    #endregion


    #region "Events"

    /// <summary>
    /// Occurs when mode (listing/edit) is changed.
    /// </summary>
    /// <param name="isListingMode">Indicates if control is in listing mode</param>
    public delegate void ModeChangedHandler(bool isListingMode);

    public event ModeChangedHandler OnModeChanged;

    #endregion


    #region "Private properties"

    private CheckoutProcessInfo CheckoutProcess
    {
        get
        {
            if (mCheckoutProcess == null)
            {
                mCheckoutProcess = new CheckoutProcessInfo();
                mCheckoutProcess.LoadXmlDefinition(CheckoutProcessXml);
            }
            return mCheckoutProcess;
        }
    }


    /// <summary>
    /// Checkout process XML - shopping cart steps definition in XML format.
    /// </summary>
    private string CheckoutProcessXml
    {
        get
        {
            return hdnCheckoutProcessXml.Value;
        }
        set
        {
            hdnCheckoutProcessXml.Value = value;
        }
    }


    /// <summary>
    /// Checkout process type.
    /// </summary>
    private CheckoutProcessEnum CheckoutProcessType
    {
        get
        {
            object obj = ViewState["CheckoutProcessType"];
            if (obj != null)
            {
                return (CheckoutProcessEnum)(obj);
            }

            ViewState["CheckoutProcessType"] = 0;
            return (CheckoutProcessEnum)ViewState["CheckoutProcessType"];
        }
        set
        {
            ViewState["CheckoutProcessType"] = value;
        }
    }


    /// <summary>
    /// Original step name.
    /// </summary>
    private string OriginalStepName
    {
        get
        {
            return Convert.ToString(ViewState["OriginalStepName"]);
        }
        set
        {
            ViewState["OriginalStepName"] = value;
        }
    }


    /// <summary>
    /// Indicates if control is in listing mode or in edit/insert mode.
    /// </summary>
    private bool ListingMode
    {
        set
        {
            plcList.Visible = value;
            plcEdit.Visible = !value;

            if (OnModeChanged != null)
            {
                OnModeChanged(value);
            }
        }
    }

    #endregion


    #region "Public properties"

    /// <summary>
    /// Checkout definition update event handler.
    /// </summary>
    public event OnCheckoutProcessDefinitionUpdateEventHandler OnCheckoutProcessDefinitionUpdate;


    /// <summary>
    /// Header actions control
    /// </summary>
    public override HeaderActions HeaderActions
    {
        get
        {
            return headerActions;
        }
    }



    /// <summary>
    /// Messages placeholder
    /// </summary>
    public override MessagesPlaceHolder MessagesPlaceHolder
    {
        get
        {
            return plcMess;
        }
    }


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


    /// <summary>
    /// Image folder.
    /// </summary>
    public string ImageFolder
    {
        get
        {
            return mImageFolder;
        }
        set
        {
            mImageFolder = value;
        }
    }


    /// <summary>
    /// Information.
    /// </summary>
    public string Information
    {
        set
        {
            ShowConfirmation(value);
        }
    }


    /// <summary>
    /// Gets or sets field value.
    /// </summary>
    public override object Value
    {
        get
        {
            try
            {
                XmlDocument xml = new XmlDocument();
                xml.LoadXml(CheckoutProcessXml);
                if (xml.DocumentElement.SelectNodes("step").Count == 0)
                {
                    return "";
                }
            }
            catch
            {
                return "";
            }

            return CheckoutProcessXml;
        }
        set
        {
            CheckoutProcessXml = Convert.ToString(value);
        }
    }


    /// <summary>
    /// Indicates whether checkout process types should be visible and editable to user. 
    /// FALSE - Default value. Step is created without relation to any of the default checkout process. 
    /// Use this option when control is used to generate custom shopping cart webpart checkout process. 
    /// TRUE - User can choose from the default checkout process the step will be included in.
    /// </summary>
    public bool EnableDefaultCheckoutProcessTypes
    {
        get
        {
            return ValidationHelper.GetBoolean(ViewState["EnableDefaultCheckoutProcessTypes"], false);
        }
        set
        {
            ViewState["EnableDefaultCheckoutProcessTypes"] = value;
        }
    }


    /// <summary>
    /// Gets ClientID of the hidden field which stores the actual value of the control.
    /// </summary>
    public override string ValueElementID
    {
        get
        {
            return hdnCheckoutProcessXml.ClientID;
        }
    }

    #endregion


    #region "Page Events"

    protected override void OnInit(EventArgs e)
    {
        // Attach Event Handlers for uniGrid 
        ugSteps.OnExternalDataBound += ugSteps_OnExternalDataBound;
        ugSteps.OnAction += ugSteps_OnAction;
    }


    protected void Page_Load(object sender, EventArgs e)
    {
        if (EnableDefaultCheckoutProcessTypes)
        {

            // Register javascript to confirm generate default checkout process
            string script = "function ConfirmDefaultProcess() {return confirm(" + ScriptHelper.GetLocalizedString("CheckoutProcess.ConfirmDefaultProcess") + ");}";
            ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmDefaultProcess", ScriptHelper.GetScript(script));
        }

        // Initialize validators
        rfvStepCaption.ErrorMessage = GetString("CheckoutProcess.ErrorStepCaptionEmpty");
        rfvStepControlPath.ErrorMessage = GetString("CheckoutProcess.ErrorStepControlPathEmpty");
        rfvStepName.ErrorMessage = GetString("CheckoutProcess.ErrorStepNameEmpty");

        // Disable sorting of steps
        ugSteps.GridView.AllowSorting = false;

        if (!RequestHelper.IsPostBack())
        {
            ListingMode = true;
            ReloadData();
        }
    }


    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // Hide default checkout process types - for live site usage
        if (!EnableDefaultCheckoutProcessTypes)
        {
            // Step list
            ugSteps.NamedColumns["LiveSite"].Visible = false;
            ugSteps.NamedColumns["CMSDeskCustomer"].Visible = false;
            ugSteps.NamedColumns["CMSDeskOrder"].Visible = false;
            ugSteps.NamedColumns["CMSDeskOrderItems"].Visible = false;
        }

        // Initialize breadcrumb items
        breadcrumbs.AddBreadcrumb(new BreadcrumbItem
        {
            Text = GetString("CheckoutProcess.lnkList"),
            RedirectUrl = "~/CMSModules/Ecommerce/Pages/Tools/Configuration/StoreSettings/StoreSettings_CheckoutProcess.aspx"
        });
        breadcrumbs.AddBreadcrumb(new BreadcrumbItem
        {
            Text = breadcrumbsText,
        });
    }

    #endregion


    #region "Event Handlers"

    /// <summary>
    /// Handles data bound of unigrid
    /// </summary>
    protected object ugSteps_OnExternalDataBound(object sender, string sourceName, object parameter)
    {
        // Formatting columns
        switch (sourceName.ToLowerCSafe())
        {
            case "steporder":
                return mStepOrder++;
        }
        return parameter;
    }


    /// <summary>
    /// Handles unigrid actions.
    /// </summary>
    protected void ugSteps_OnAction(string actionName, object actionArgument)
    {
        // Name of checkout process step
        string stepName = ValidationHelper.GetString(actionArgument, "");

        switch (actionName.ToLowerCSafe())
        {
            case "up":
                // Move node up in xml
                CheckoutProcess.MoveCheckoutProcessStepNodeUp(stepName);

                // Update xml definition in view state
                CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();

                RaiseDefinitionUpdate("moveup");

                ReloadData();
                break;

            case "down":
                // Move node down in xml definition
                CheckoutProcess.MoveCheckoutProcessStepNodeDown(stepName);

                // Update xml definition in viewstate
                CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();

                RaiseDefinitionUpdate("movedown");

                ReloadData();
                break;

            case "edit":
                ListingMode = false;
                plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes;

                // Load step data to the form
                CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(stepName);
                if (stepObj != null)
                {
                    breadcrumbsText = ResHelper.LocalizeString(stepObj.Caption);

                    txtStepCaption.Text = stepObj.Caption;
                    txtStepControlPath.Text = stepObj.ControlPath;
                    txtStepImageUrl.Text = stepObj.Icon;
                    txtStepName.Text = stepObj.Name;
                    chkLiveSite.Checked = stepObj.ShowOnLiveSite;
                    chkCMSDeskOrder.Checked = stepObj.ShowInCMSDeskOrder;
                    chkCMSDeskCustomer.Checked = stepObj.ShowInCMSDeskCustomer;
                    chkCMSDeskOrderItems.Checked = stepObj.ShowInCMSDeskOrderItems;

                    // Save original step name
                    OriginalStepName = stepObj.Name;
                }
                break;

            case "delete":
                // Remove node from xml
                CheckoutProcess.RemoveCheckoutProcessStepNode(stepName);
                // Update xml definition in view state
                CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();

                RaiseDefinitionUpdate("delete");

                ReloadData();
                break;
        }
    }


    /// <summary>
    /// LnkNewStep click event handler.
    /// </summary>
    protected void lnkNewStep_Click(object sender, EventArgs e)
    {
        NewStep();
    }


    /// <summary>
    /// BtnDefaultProcess click event handler.
    /// </summary>
    protected void btnDefaultProcess_Click(object sender, EventArgs e)
    {
        GenerateDefaultProcess();
    }


    /// <summary>
    /// BtnOk click event handler.
    /// </summary>
    protected void btnOk_Click(object sender, EventArgs e)
    {
        breadcrumbsText = GetString("CheckoutProcess.NewStep");

        string errorMessage = ValidateForm();

        if (errorMessage == "")
        {
            CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(txtStepName.Text.Trim());
            if ((stepObj == null) || (stepObj.Name.ToLowerCSafe() == OriginalStepName.ToLowerCSafe()))
            {
                if (stepObj == null)
                {
                    stepObj = new CheckoutProcessStepInfo();
                }

                // Save localization
                txtStepCaption.Save();

                // Get step data from form
                stepObj.Caption = txtStepCaption.Text.Trim();
                stepObj.Name = txtStepName.Text.Trim();
                stepObj.ControlPath = txtStepControlPath.Text.Trim();
                stepObj.Icon = txtStepImageUrl.Text.Trim();
                stepObj.ShowInCMSDeskCustomer = chkCMSDeskCustomer.Checked;
                stepObj.ShowInCMSDeskOrder = chkCMSDeskOrder.Checked;
                stepObj.ShowOnLiveSite = chkLiveSite.Checked;
                stepObj.ShowInCMSDeskOrderItems = chkCMSDeskOrderItems.Checked;

                if ((OriginalStepName != "") && (OriginalStepName.ToLowerCSafe() != txtStepName.Text.ToLowerCSafe()))
                {
                    // Replace node
                    CheckoutProcess.ReplaceCheckoutProcessStepNode(stepObj, OriginalStepName);
                }
                else
                {
                    // Update or insert node
                    CheckoutProcess.SetCheckoutProcessStepNode(stepObj);
                }

                // Update Xml definition in viewstate
                CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();

                if (OnCheckoutProcessDefinitionUpdate != null)
                {
                    OnCheckoutProcessDefinitionUpdate("update");
                }

                breadcrumbsText = ResHelper.LocalizeString(stepObj.Caption);

                ListingMode = true;
                ReloadData();
                ugSteps.ReloadData();
            }
            else
            {
                errorMessage = GetString("CheckoutProcess.ErrorStepNameNotUnique");
            }
        }

        // Show error message
        if (errorMessage != "")
        {
            plcMessNew.ShowError(errorMessage);

            // If error during editing, set original caption to breadcrumbs
            if (!string.IsNullOrEmpty(OriginalStepName))
            {
                CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(OriginalStepName);
                if (stepObj != null)
                {
                    breadcrumbsText = ResHelper.LocalizeString(stepObj.Caption);
                }
            }
        }
    }


    /// <summary>
    /// Validates form input data and returns error message if some error occurs.
    /// </summary>
    private string ValidateForm()
    {
        return new Validator().NotEmpty(txtStepCaption.Text.Trim(), rfvStepCaption.ErrorMessage).
            NotEmpty(txtStepName.Text.Trim(), rfvStepName.ErrorMessage).
            NotEmpty(txtStepControlPath.Text.Trim(), rfvStepControlPath.ErrorMessage).
            IsCodeName(txtStepName.Text.Trim(), GetString("General.ErrorCodeNameInIdentifierFormat")).Result;
    }


    /// <summary>
    /// Reloads data in unigrid.
    /// </summary>
    public void ReloadData()
    {
        // Load xml definition from viewstate
        CheckoutProcess.LoadXmlDefinition(CheckoutProcessXml);

        // Create data source for unigrid
        DataSet ds = new DataSet();
        ds.Tables.Add(CheckoutProcess.GetDataTableFromXmlDefinition(CheckoutProcessType));

        // Fill unigrid
        ugSteps.DataSource = ds;
        ugSteps.DataBind();
    }


    /// <summary>
    /// Check validity of the control.
    /// </summary>
    public override bool IsValid()
    {
        if ((string)Value == "")
        {
            ValidationError = GetString("CheckoutProcess.ErrorProcessEmpty");
            return false;
        }

        ValidationError = "";
        return true;
    }


    /// <summary>
    /// Opens new step form.
    /// </summary>
    public void NewStep()
    {
        ListingMode = false;
        plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes;
        breadcrumbsText = GetString("CheckoutProcess.NewStep");

        // Set default values
        txtStepCaption.Text = "";
        txtStepControlPath.Text = "";
        txtStepImageUrl.Text = "";
        txtStepName.Text = "";
        chkCMSDeskCustomer.Checked = false;
        chkCMSDeskOrder.Checked = false;
        chkLiveSite.Checked = false;
        chkCMSDeskOrderItems.Checked = false;

        // Clear original step name
        OriginalStepName = "";
    }


    /// <summary>
    /// Generates default process.
    /// </summary>
    public void GenerateDefaultProcess()
    {
        RaiseDefinitionUpdate("defaultprocess");
        ugSteps.ReloadData();
    }


    /// <summary>
    /// Generates process from global.
    /// </summary>
    public void GenerateFromGlobalProcess()
    {
        RaiseDefinitionUpdate("fromglobalprocess");
        ugSteps.ReloadData();
    }


    /// <summary>
    /// Raises OnCheckoutProcessDefinitionUpdate event with given update reason name.
    /// </summary>
    /// <param name="reason">Update reason name constant.</param>
    protected void RaiseDefinitionUpdate(string reason)
    {
        if (OnCheckoutProcessDefinitionUpdate != null)
        {
            OnCheckoutProcessDefinitionUpdate(reason);
        }
    }

    #endregion
}