protected void BtnSubmit_Click(object sender, EventArgs e)
    {
        PageBase page = (PageBase)this.Page;
        RM rm = new RM(ResourceFile.Msg);

        if (mode != PageMode.View)
        {
            page.Alert(rm["SAVEFIRST"]);
            return;
        }

        CheckSubmitReturnMessage = "";

        if (OnBeforeProcessSubmit != null)
        {
            OnBeforeProcessSubmit(this, EventArgs.Empty);
        }

        if (CheckSubmitReturnMessage.Length != 0)
        {
            page.Alert(CheckSubmitReturnMessage);
            return;
        }

        if (!CheckSubmitResult)
        {
            return;
        }


        //if (AppSetting.HttpsEnabled)
        //{
        //    HttpClientCertificate cert = Request.ClientCertificate;
        //    if (!Certificate.CheckClientCertificate(cert))
        //    {
        //        page.Alert("Your client certificate has problem, please contact helpdesk!");
        //        return;
        //    }
        //}

        if (GrdActivity.EditIndex > -1)
        {
            InstanceProcess instprocess = new InstanceProcess(ApplicationID, ProcessID, InstanceID);
            GridViewRow editRow = GrdActivity.Rows[GrdActivity.EditIndex];
            RadioButtonList rblOperation = (RadioButtonList)editRow.FindControl("RblOperation");
            UcTextBox txtRemark = (UcTextBox)editRow.FindControl("TxtRemark");


            if (rblOperation.SelectedItem == null)
            {
                page.Alert(rm["PleaseSelectOperation"]);
                return;
            }
            string operationCode = rblOperation.SelectedValue;

            int assignTo = 0;
            int userID = CurrentUser.UserID;

            int redefineStateId = State.GetStateID(UserDefineProcess.RedefineStateCode);
            int userdefineStateId = State.GetStateID(UserDefineProcess.UserDefineStateCode);

            if (operationCode.ToUpper() == "FORWARD")
            {
                assignTo = Fn.ToInt(HidForwardPerson.Value);
                if (assignTo == 0)
                {
                    page.Alert(rm["Notsetforward"]);
                    return;
                }
            }

            if (operationCode.ToUpper() == "HOLD")
            {
                InstanceProcessTemplate instanceTemplate = new InstanceProcessTemplate();
                assignTo = instanceTemplate.GetApplicantId(ApplicationID, InstanceID);
            }

            if (operationCode.ToUpper() == "APPROVE" && CurrentStateID == State.GetStateID(UserDefineProcess.RedefineStateCode))
            {
                int c = UserDefineProcess.GetItemsCount(ApplicationID, InstanceID);
                if (c == 0)
                {
                    page.Alert(rm["PROCESS_NOT_DEFINED"]);
                    return;
                }
                string errorMessageDefine;
                if (!UserDefineProcess.SetUserDefineProcessStep(
                    ApplicationID, ProcessID, InstanceID, txtRemark.Text, out errorMessageDefine))
                {
                    page.Alert(rm["SubmitFailed"] + errorMessageDefine);
                    return;
                }
                else
                {
                    if (OnAfterRedefineProcessSubmit != null)
                    {
                        RM rm2 = new RM(ResourceFile.Msg);
                        OnAfterRedefineProcessSubmit(this, new RedefineSubmitEventArgs(rm2["RedefineFlowStep"]));
                    }
                }
            }
            else
            {
                string errorMessage;
                InstanceProcessTemplate instanceTemplate = new InstanceProcessTemplate(OnAfterworkFlowTransit);
                if (!instanceTemplate.TransitProcess(ApplicationID, ProcessID, InstanceID, IsUserDefineProcess, CurrentStateID, operationCode, txtRemark.Text, assignTo, out errorMessage))
                {
                    page.Alert(rm["SubmitFailed"] + errorMessage);
                    return;
                }
                else
                {
                    if (CurrentStateID == redefineStateId || CurrentStateID == userdefineStateId)
                    {
                        if (OnAfterRedefineProcessSubmit != null)
                        {
                            OnAfterRedefineProcessSubmit(this, new RedefineSubmitEventArgs(UserDefineProcess.GetOperationNameByCode(operationCode)));
                        }
                    }
                }

                if (OnSubmitSuccess != null)
                {
                    OnSubmitSuccess(this, new EventArgs());
                }
            }
            SetInstanceActivityGrid();
        }
    }