using System;
using System.Data;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
using CMS.EcommerceProvider;
using CMS.FormControls;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.UIControls;
using CMS.ExtendedControls;
///
/// Checkout definition update event handler.
///
public delegate void OnCheckoutProcessDefinitionUpdateEventHandler(string action);
public partial class CMSModules_Ecommerce_FormControls_CheckoutProcess : FormEngineUserControl
{
#region "Variables"
private string mImageFolder = "";
private CheckoutProcessInfo mCheckoutProcess = null;
#endregion
#region "Events"
///
/// Occurs when mode (listing/edit) is changed.
///
/// Indicates if control is in listing mode
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;
}
}
///
/// Checkout process XML - shopping cart steps definition in XML format.
///
private string CheckoutProcessXml
{
get
{
//object obj = ViewState["CheckoutProcessXml"];
//if (obj != null)
//{
// return Convert.ToString(obj);
//}
//else
//{
// ViewState["CheckoutProcessXml"] = "";
// return Convert.ToString(ViewState["CheckoutProcessXml"]);
//}
return hdnCheckoutProcessXml.Value;
}
set
{
//ViewState["CheckoutProcessXml"] = value;
hdnCheckoutProcessXml.Value = value;
}
}
///
/// Checkout process type.
///
private CheckoutProcessEnum CheckoutProcessType
{
get
{
object obj = ViewState["CheckoutProcessType"];
if (obj != null)
{
return (CheckoutProcessEnum)(obj);
}
else
{
ViewState["CheckoutProcessType"] = 0;
return (CheckoutProcessEnum)ViewState["CheckoutProcessType"];
}
}
set
{
ViewState["CheckoutProcessType"] = value;
}
}
///
/// Original step name.
///
private string OriginalStepName
{
get
{
return Convert.ToString(ViewState["OriginalStepName"]);
}
set
{
ViewState["OriginalStepName"] = value;
}
}
///
/// Indicates if control is in listing mode or in edit/insert mode.
///
private bool ListingMode
{
get
{
return plcList.Visible;
}
set
{
plcList.Visible = value;
plcEdit.Visible = !value;
if (OnModeChanged != null)
{
OnModeChanged(value);
}
}
}
#endregion
#region "Public Properties"
///
/// Checkout definition update event handler.
///
public event OnCheckoutProcessDefinitionUpdateEventHandler OnCheckoutProcessDefinitionUpdate;
///
/// Header actions control
///
public override HeaderActions HeaderActions
{
get
{
return headerActions;
}
}
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
return plcMess;
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
plcMessNew.IsLiveSite = value;
plcMess.IsLiveSite = value;
base.IsLiveSite = value;
}
}
///
/// Image folder.
///
public string ImageFolder
{
get
{
return mImageFolder;
}
set
{
mImageFolder = value;
}
}
///
/// Information.
///
public string Information
{
set
{
ShowConfirmation(value);
}
}
///
/// Gets or sets field value.
///
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);
}
}
///
/// 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.
///
public bool EnableDefaultCheckoutProcessTypes
{
get
{
return ValidationHelper.GetBoolean(ViewState["EnableDefaultCheckoutProcessTypes"], false);
}
set
{
ViewState["EnableDefaultCheckoutProcessTypes"] = value;
}
}
///
/// Gets or sets the enabled state of the control.
///
public override bool Enabled
{
get
{
return base.Enabled;
}
set
{
base.Enabled = value;
}
}
///
/// Gets ClientID of the hidden field which stores the actual value of the control.
///
public override string ValueElementID
{
get
{
return hdnCheckoutProcessXml.ClientID;
}
}
///
/// Indicates, if actions are visible. Set to false, when handling actions programmatically.
///
public bool ShowActions
{
get
{
return pnlHeaderLine.Visible;
}
set
{
pnlHeaderLine.Visible = value;
}
}
#endregion
#region "Template Properties"
// Variables
protected string mActions = "";
protected string mName = "";
protected string mOrder = "";
protected string mCaption = "";
protected string mShowOnLiveSite = "";
protected string mShowInCMSDeskOrder = "";
protected string mShowInCMSDeskOrderItems = "";
protected string mShowInCMSDeskCustomer = "";
protected string btnEditImageUrl = "";
protected string btnDeleteImageUrl = "";
protected string btnMoveUpImageUrl = "";
protected string btnMoveDownImageUrl = "";
protected string btnEditToolTip = "";
protected string btnDeleteToolTip = "";
protected string btnMoveUpToolTip = "";
protected string btnMoveDownToolTip = "";
#endregion
#region "Page Events"
protected void Page_Load(object sender, EventArgs e)
{
// Register javascript to confirm delete action
string script = "function ConfirmDelete() {return confirm(" + ScriptHelper.GetString(GetString("CheckoutProcess.ConfirmDeleteStep")) + ");}";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmDeleteStep", ScriptHelper.GetScript(script));
if (EnableDefaultCheckoutProcessTypes)
{
btnDefaultProcess.Visible = true;
btnDefaultProcess.Text = GetString("CheckoutProcess.DefaultProcess");
// Register javascript to confirm generate default checkout process
script = "function ConfirmDefaultProcess() {return confirm(" + ScriptHelper.GetString(GetString("CheckoutProcess.ConfirmDefaultProcess")) + ");}";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmDefaultProcess", ScriptHelper.GetScript(script));
}
// Initialize button images
if (ImageFolder == "")
{
ImageFolder = GetImageUrl("Design/Controls/UniGrid/Actions/", IsLiveSite, true);
}
if (CultureHelper.IsUICultureRTL())
{
gridSteps.RowStyle.HorizontalAlign = HorizontalAlign.Right;
}
else
{
gridSteps.RowStyle.HorizontalAlign = HorizontalAlign.Left;
}
btnEditImageUrl = ImageFolder + "Edit.png";
btnDeleteImageUrl = ImageFolder + "Delete.png";
btnMoveUpImageUrl = ImageFolder + "Up.png";
btnMoveDownImageUrl = ImageFolder + "Down.png";
// Initialize button tooltips
btnEditToolTip = GetString("general.edit");
btnDeleteToolTip = GetString("general.delete");
btnMoveUpToolTip = GetString("CheckoutProcess.btnMoveUpToolTip");
btnMoveDownToolTip = GetString("CheckoutProcess.btnMoveDownToolTip");
// Initialize grid labels
mActions = GetString("unigrid.actions");
mName = GetString("general.name");
mOrder = GetString("CheckoutProcess.Order");
mCaption = GetString("CheckoutProcess.Caption");
mShowOnLiveSite = GetString("CheckoutProcess.ShowOnLiveSite");
mShowInCMSDeskOrder = GetString("CheckoutProcess.ShowInCMSDeskOrder");
mShowInCMSDeskOrderItems = GetString("CheckoutProcess.ShowInCMSDeskOrderItems");
mShowInCMSDeskCustomer = GetString("CheckoutProcess.ShowInCMSDeskCustomer");
// Initialize validators
rfvStepCaption.ErrorMessage = GetString("CheckoutProcess.ErrorStepCaptionEmpty");
rfvStepControlPath.ErrorMessage = GetString("CheckoutProcess.ErrorStepControlPathEmpty");
rfvStepName.ErrorMessage = GetString("CheckoutProcess.ErrorStepNameEmpty");
// Initialize other controls
lnkNewStep.Text = GetString("CheckoutProcess.lnkNewStep");
imgNewItem.ImageUrl = GetImageUrl("CMSModules/CMS_Ecommerce/addstep.png");
imgNewItem.AlternateText = GetString("general.new");
lnkList.Text = GetString("CheckoutProcess.lnkList");
lblStepCaption.Text = GetString("CheckoutProcess.lblStepCaption");
lblStepControlPath.Text = GetString("CheckoutProcess.lblStepControlPath");
lblStepImageUrl.Text = GetString("CheckoutProcess.lblStepImageUrl");
lblStepName.Text = GetString("general.codename") + ResHelper.Colon;
lblLiveSite.Text = GetString("CheckoutProcess.lblLiveSite");
lblCMSDeskCustomer.Text = GetString("CheckoutProcess.lblCMSDeskCustomer");
lblCMSDeskOrder.Text = GetString("CheckoutProcess.lblCMSDeskOrder");
lblCMSDeskOrderItems.Text = GetString("CheckoutProcess.lblCMSDeskOrderItems");
gridSteps.RowDataBound += new GridViewRowEventHandler(gridSteps_RowDataBound);
// Hide default checkout process types
if (!EnableDefaultCheckoutProcessTypes)
{
// Step list
gridSteps.Columns[3].Visible = false;
gridSteps.Columns[4].Visible = false;
gridSteps.Columns[5].Visible = false;
gridSteps.Columns[6].Visible = false;
}
if (!RequestHelper.IsPostBack())
{
ListingMode = true;
ReloadData();
}
// Enabling and disabling controls
lnkNewStep.Enabled = Enabled;
if (!pnlHeaderLine.Visible)
{
btnDefaultProcess.Visible = false;
}
}
#endregion
#region "Event Handlers"
private void gridSteps_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[1].Text = Convert.ToString(e.Row.RowIndex + 1);
// Apply even/odd row CSS class
e.Row.CssClass = (e.Row.RowIndex % 2 > 0) ? "OddRow" : "EvenRow";
}
}
///
/// LnkNewStep click event handler.
///
protected void lnkNewStep_Click(object sender, EventArgs e)
{
NewStep();
}
///
/// LnkList click event handler.
///
protected void lnkList_Click(object sender, EventArgs e)
{
ListingMode = true;
}
///
/// BtnDefaultProcess click event handler.
///
protected void btnDefaultProcess_Click(object sender, EventArgs e)
{
GenerateDefaultProcess();
}
///
/// BtnOk click event handler.
///
protected void btnOk_Click(object sender, EventArgs e)
{
lblCurrentStep.Text = 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");
}
//lblInfo.Visible = true;
//lblInfo.Text = GetString("General.ChangesSaved");
lblCurrentStep.Text = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(stepObj.Caption));
ListingMode = true;
ReloadData();
}
else
{
errorMessage = GetString("CheckoutProcess.ErrorStepNameNotUnique");
}
}
// Show error message
if (errorMessage != "")
{
plcMessNew.ShowError(errorMessage, null, null);
// If error during editing, set original caption to breadcrumbs
if (!string.IsNullOrEmpty(OriginalStepName))
{
CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(OriginalStepName);
if (stepObj != null)
{
lblCurrentStep.Text = HTMLHelper.HTMLEncode(ResHelper.LocalizeString(stepObj.Caption));
}
}
}
}
///
/// Validates form input data and returns error message if some error occurs.
///
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;
}
///
/// Reloads data in gridview.
///
public void ReloadData()
{
// Load xml definition from viewstate
CheckoutProcess.LoadXmlDefinition(CheckoutProcessXml);
gridSteps.DataSource = CheckoutProcess.GetDataTableFromXmlDefinition(CheckoutProcessType);
gridSteps.DataBind();
}
///
/// BtnEdit click event handler.
///
protected void btnEdit_Click(object sender, EventArgs e)
{
ListingMode = false;
plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes;
// Load step data to the form
CheckoutProcessStepInfo stepObj = CheckoutProcess.GetCheckoutProcessStepInfo(((ImageButton)(sender)).CommandArgument);
if (stepObj != null)
{
lblCurrentStep.Text = HTMLHelper.HTMLEncode(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;
}
}
///
/// BtnDelete click event handler.
///
protected void btnDelete_Click(object sender, EventArgs e)
{
// Remove node from xml
CheckoutProcess.RemoveCheckoutProcessStepNode(((ImageButton)sender).CommandArgument);
// Update xml definition in viewstate
CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();
if (OnCheckoutProcessDefinitionUpdate != null)
{
OnCheckoutProcessDefinitionUpdate("delete");
}
ReloadData();
}
///
/// BtnMoveUp click event handler.
///
protected void btnMoveUp_Click(object sender, EventArgs e)
{
// Move node up in xml
CheckoutProcess.MoveCheckoutProcessStepNodeUp(((ImageButton)sender).CommandArgument);
// Update xml definition in viewstate
CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();
if (OnCheckoutProcessDefinitionUpdate != null)
{
OnCheckoutProcessDefinitionUpdate("moveup");
}
ReloadData();
}
///
/// BtnMoveDown click event handler.
///
protected void btnMoveDown_Click(object sender, EventArgs e)
{
// Move node down in xml definition
CheckoutProcess.MoveCheckoutProcessStepNodeDown(((ImageButton)sender).CommandArgument);
// Update xml definition in viewstate
CheckoutProcessXml = CheckoutProcess.GetXmlDefinition();
if (OnCheckoutProcessDefinitionUpdate != null)
{
OnCheckoutProcessDefinitionUpdate("movedown");
}
ReloadData();
}
///
/// Check validity of the control.
///
public override bool IsValid()
{
if ((string)Value == "")
{
ValidationError = GetString("CheckoutProcess.ErrorProcessEmpty");
return false;
}
else
{
ValidationError = "";
return true;
}
}
///
/// Returns colored boolean value string (TRUE -> green color, FALSE - red color)
///
/// Boolean value string
protected string GetColoredBooleanString(object val)
{
return UniGridFunctions.ColoredSpanYesNo(val);
}
///
/// Opens new step form.
///
public void NewStep()
{
ListingMode = false;
plcDefaultTypes.Visible = EnableDefaultCheckoutProcessTypes;
lblCurrentStep.Text = 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 = "";
}
///
/// Generates default process.
///
public void GenerateDefaultProcess()
{
OnCheckoutProcessDefinitionUpdate("defaultprocess");
}
///
/// Generates process from global.
///
public void GenerateFromGlobalProcess()
{
OnCheckoutProcessDefinitionUpdate("fromglobalprocess");
}
#endregion
}