protected void ButtonImport_OnClick(Object sender, EventArgs eventArgs)
        {
            System.Data.DataView sortedNdcView = new DataView(ndcImportTable);

            // sortedNdcView.Sort = "category, ndc_code"; // 2009

            sortedNdcView.Sort = "[Category], [NDC Code]"; // 2011

            Boolean allowOverwrite = false;

            Boolean allowMerge = true;

            Boolean processNdc = false;

            Boolean serviceProcess = true;



            String currentServiceName = String.Empty;

            Client.Core.MedicalServices.ServiceSingleton currentSingleton = null;

            Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition currentSingletonDefinition = null;



            System.Data.DataTable importResultsTable = new DataTable();

            importResultsTable.Columns.Add("ObjectType");

            importResultsTable.Columns.Add("ObjectName");

            importResultsTable.Columns.Add("Success");

            importResultsTable.Columns.Add("Exception");

            importResultsTable.Columns.Add("Id");



            foreach (System.Data.DataRow currentRow in sortedNdcView.ToTable().Rows)
            {
                String categoryName = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(currentRow["category"].ToString());

                categoryName = categoryName.Replace("\"", "");

                String serviceName = "Medication - " + categoryName;

                if (currentServiceName != serviceName)
                {
                    #region New Services based on Change in Medication Name

                    if (currentSingleton != null)
                    {
                        #region If Working on Previous Service, Save before Continuing

                        if (currentSingletonDefinition != null)
                        {
                            if (!String.IsNullOrEmpty(currentSingletonDefinition.NdcCodeCriteria))
                            {
                                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}{", ", ");

                                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("{", "");

                                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}", "");

                                currentSingletonDefinition.NdcCodeCriteria.Trim();

                                if (!String.IsNullOrWhiteSpace(currentSingletonDefinition.NdcCodeCriteria))
                                {
                                    currentSingleton.Definitions.Add(currentSingletonDefinition);
                                }
                            }
                        }

                        Mercury.Server.Application.ObjectSaveResponse saveResponse = application.MedicalServiceSave(currentSingleton);

                        importResultsTable.Rows.Add(

                            "Singleton",

                            currentSingleton.Name,

                            saveResponse.Success,

                            (saveResponse.HasException) ? saveResponse.Exception.Message : String.Empty,

                            saveResponse.Id

                            );

                        #endregion
                    }

                    serviceProcess = true;

                    currentServiceName = serviceName;

                    currentSingleton = application.MedicalServiceSingletonGet(application.MedicalServiceGetIdByName(currentServiceName));

                    if (currentSingleton == null)
                    {
                        serviceProcess = true;

                        currentSingleton = new Mercury.Client.Core.MedicalServices.ServiceSingleton(application);

                        currentSingleton.Name = currentServiceName;

                        currentSingleton.Description = currentServiceName;

                        currentSingleton.ServiceType = Mercury.Server.Application.MedicalServiceType.Singleton;

                        currentSingleton.ServiceClassification = Mercury.Server.Application.ServiceClassification.Medication;
                    }

                    else
                    {
                        serviceProcess = allowOverwrite || allowMerge;

                        if (allowOverwrite)
                        {
                            foreach (Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition currentDefinition in currentSingleton.Definitions)
                            {
                                currentDefinition.Enabled = false;
                            }
                        }
                    }

                    currentSingletonDefinition = null;

                    #endregion
                }


                if (currentSingletonDefinition != null)
                {
                    #region Current Definition Exists for Appending, check Length for cutoff

                    if (currentSingletonDefinition.NdcCodeCriteria.Length > 800)
                    {
                        currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}{", ", ");

                        currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("{", "");

                        currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}", "");

                        currentSingletonDefinition.NdcCodeCriteria.Trim();

                        if (!String.IsNullOrWhiteSpace(currentSingletonDefinition.NdcCodeCriteria))
                        {
                            currentSingleton.Definitions.Add(currentSingletonDefinition);
                        }

                        currentSingletonDefinition = null;
                    }

                    #endregion
                }


                if (currentSingletonDefinition == null)   // MUST REMAIN AS ITS OWN VALIDATION SINCE A CUTOFF WILL SET CURRENT BACK TO NULL

                {
                    #region No Current Definition to Append To, Create New Definition

                    currentSingletonDefinition = new Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition(MercuryApplication);

                    currentSingletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Pharmacy;

                    #endregion
                }

                if (serviceProcess)
                {
                    // VALIDATE THAT THE SINGLETON DOES NOT ALREADY CONTAIN THE NDC IN ANOTHER DEFINITION

                    if (!currentSingleton.ContainsNdc(currentRow["NDC Code"].ToString().Trim()))
                    {
                        // 2009: currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria + "{" + (currentRow["ndc_code"].ToString ().Trim ()) + "}";

                        currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria + "{" + (currentRow["NDC Code"].ToString().Trim()) + "}";   // 2011
                    }
                }
            }


            if ((currentSingleton != null) && (currentSingletonDefinition != null))
            {
                #region SAVE ANY LEFT OVER SERVICE AND DEFINITION FROM LOOP

                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}{", ", ");

                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("{", "");

                currentSingletonDefinition.NdcCodeCriteria = currentSingletonDefinition.NdcCodeCriteria.Replace("}", "");

                currentSingletonDefinition.NdcCodeCriteria.Trim();

                if (!String.IsNullOrWhiteSpace(currentSingletonDefinition.NdcCodeCriteria))
                {
                    currentSingleton.Definitions.Add(currentSingletonDefinition);
                }


                Mercury.Server.Application.ObjectSaveResponse saveResponse = application.MedicalServiceSave(currentSingleton);

                importResultsTable.Rows.Add(

                    "Singleton",

                    currentSingleton.Name,

                    saveResponse.Success,

                    (saveResponse.HasException) ? saveResponse.Exception.Message : String.Empty,

                    saveResponse.Id

                    );

                #endregion
            }

            System.Data.DataView importResultsView = new DataView(importResultsTable);

            importResultsView.Sort = "ObjectType, ObjectName";

            ImportResultsGrid.DataSource = importResultsView;

            ImportResultsGrid.Rebind();

            ButtonImport.Visible = false;


            return;
        }
        protected void ButtonAddUpdateDefinition_OnClick(Object sender, EventArgs eventArgs)
        {
            Boolean hasValue = false;

            Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition singletonDefinition = null;

            Dictionary <String, String> validationResponse;

            if (MercuryApplication == null)
            {
                Response.RedirectLocation = "/PermissionDenied.aspx";
            }


            switch (ServiceTypeSelection.SelectedValue)
            {
            case "CustomCriteria":

                if (!String.IsNullOrEmpty(CriteriaCustomStoredProcedureName.Text))
                {
                    hasValue = true;
                }

                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Custom;

                    singletonDefinition.CustomCriteria = CriteriaCustomStoredProcedureName.Text;
                }

                break;

            case "AllMedical":

                #region All Medical Definition

                if (CriteriaAllMedicalPrincipalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaAllMedicalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaAllMedicalProcedureCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaAllMedicalModifierCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaAllMedicalProviderSpecialties.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaAllMedicalUseMemberAgeCriteria.Checked)
                {
                    hasValue = true;
                }

                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.AllMedical;

                    singletonDefinition.EventDateOrder = (Mercury.Server.Application.EventDateOrder)(Int32.Parse(CriteriaAllMedicalEventDateOrder.SelectedValue));

                    singletonDefinition.PrincipalDiagnosisCriteria = CriteriaAllMedicalPrincipalDiagnosisCodes.Text;

                    singletonDefinition.DiagnosisCriteria = CriteriaAllMedicalDiagnosisCodes.Text;

                    singletonDefinition.ProcedureCodeCriteria = CriteriaAllMedicalProcedureCodes.Text;

                    singletonDefinition.ModifierCodeCriteria = CriteriaAllMedicalModifierCodes.Text;

                    singletonDefinition.ProviderSpecialtyCriteria = CriteriaAllMedicalProviderSpecialties.Text;

                    singletonDefinition.IsPcpRequiredCriteria = Convert.ToBoolean(CriteriaAllMedicalPcpPerformedService.SelectedValue);

                    singletonDefinition.UseMemberAgeCriteria = CriteriaAllMedicalUseMemberAgeCriteria.Checked;

                    singletonDefinition.MemberAgeDateQualifier = (Mercury.Server.Application.DateQualifier)Convert.ToInt32(CriteriaAllMedicalMemberAgeDateQualifier.SelectedValue);

                    singletonDefinition.MemberAgeMinimum = (CriteriaAllMedicalMemberAgeMinimum.Value.HasValue) ? Convert.ToInt32(CriteriaAllMedicalMemberAgeMinimum.Value.Value) : 0;

                    singletonDefinition.MemberAgeMaximum = (CriteriaAllMedicalMemberAgeMaximum.Value.HasValue) ? Convert.ToInt32(CriteriaAllMedicalMemberAgeMaximum.Value.Value) : 0;
                }

                #endregion

                break;

            case "Professional":

                #region Professional Definition

                if (CriteriaProfessionalPrincipalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalServiceLocations.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalProcedureCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalModifierCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalProviderSpecialties.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaProfessionalUseMemberAgeCriteria.Checked)
                {
                    hasValue = true;
                }

                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Professional;

                    singletonDefinition.EventDateOrder = (Mercury.Server.Application.EventDateOrder)(Int32.Parse(CriteriaProfessionalEventDateOrder.SelectedValue));

                    singletonDefinition.PrincipalDiagnosisCriteria = CriteriaProfessionalPrincipalDiagnosisCodes.Text;

                    singletonDefinition.DiagnosisCriteria = CriteriaProfessionalDiagnosisCodes.Text;

                    singletonDefinition.LocationCodeCriteria = CriteriaProfessionalServiceLocations.Text;

                    singletonDefinition.ProcedureCodeCriteria = CriteriaProfessionalProcedureCodes.Text;

                    singletonDefinition.ModifierCodeCriteria = CriteriaProfessionalModifierCodes.Text;

                    singletonDefinition.ProviderSpecialtyCriteria = CriteriaProfessionalProviderSpecialties.Text;

                    singletonDefinition.IsPcpRequiredCriteria = Convert.ToBoolean(CriteriaProfessionalPcpPerformedService.SelectedValue);

                    singletonDefinition.UseMemberAgeCriteria = CriteriaProfessionalUseMemberAgeCriteria.Checked;

                    singletonDefinition.MemberAgeDateQualifier = (Mercury.Server.Application.DateQualifier)Convert.ToInt32(CriteriaProfessionalMemberAgeDateQualifier.SelectedValue);

                    singletonDefinition.MemberAgeMinimum = (CriteriaProfessionalMemberAgeMinimum.Value.HasValue) ? Convert.ToInt32(CriteriaProfessionalMemberAgeMinimum.Value.Value) : 0;

                    singletonDefinition.MemberAgeMaximum = (CriteriaProfessionalMemberAgeMaximum.Value.HasValue) ? Convert.ToInt32(CriteriaProfessionalMemberAgeMaximum.Value.Value) : 0;
                }

                #endregion

                break;


            case "Institutional":

                #region Institutional Definition

                if (CriteriaInstitutionalPrincipalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalDiagnosisCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalDrgCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalIcd9Codes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalBillTypes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalRevenueCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalProcedureCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalModifierCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalProviderSpecialties.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaInstitutionalUseMemberAgeCriteria.Checked)
                {
                    hasValue = true;
                }

                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Institutional;

                    singletonDefinition.EventDateOrder = (Mercury.Server.Application.EventDateOrder)(Int32.Parse(CriteriaInstitutionalEventDateOrder.SelectedValue));

                    singletonDefinition.PrincipalDiagnosisCriteria = CriteriaInstitutionalPrincipalDiagnosisCodes.Text;

                    singletonDefinition.DiagnosisCriteria = CriteriaInstitutionalDiagnosisCodes.Text;

                    singletonDefinition.DrgCriteria = CriteriaInstitutionalDrgCodes.Text;

                    singletonDefinition.Icd9ProcedureCodeCriteria = CriteriaInstitutionalIcd9Codes.Text;

                    singletonDefinition.BillTypeCriteria = CriteriaInstitutionalBillTypes.Text;

                    singletonDefinition.RevenueCodeCriteria = CriteriaInstitutionalRevenueCodes.Text;

                    singletonDefinition.ProcedureCodeCriteria = CriteriaInstitutionalProcedureCodes.Text;

                    singletonDefinition.ModifierCodeCriteria = CriteriaInstitutionalModifierCodes.Text;

                    singletonDefinition.ProviderSpecialtyCriteria = CriteriaInstitutionalProviderSpecialties.Text;

                    singletonDefinition.UseMemberAgeCriteria = CriteriaInstitutionalUseMemberAgeCriteria.Checked;

                    singletonDefinition.MemberAgeDateQualifier = (Mercury.Server.Application.DateQualifier)Convert.ToInt32(CriteriaInstitutionalMemberAgeDateQualifier.SelectedValue);

                    singletonDefinition.MemberAgeMinimum = (CriteriaInstitutionalMemberAgeMinimum.Value.HasValue) ? Convert.ToInt32(CriteriaInstitutionalMemberAgeMinimum.Value.Value) : 0;

                    singletonDefinition.MemberAgeMaximum = (CriteriaInstitutionalMemberAgeMaximum.Value.HasValue) ? Convert.ToInt32(CriteriaInstitutionalMemberAgeMaximum.Value.Value) : 0;
                }

                #endregion

                break;

            case "Pharmacy":

                #region Pharmacy Definition

                if (CriteriaPharmacyNdcCodes.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaPharmacyDrugNames.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaPharmacyDeaClassifications.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (CriteriaPharmacyTherapeuticClassifications.Text.Length != 0)
                {
                    hasValue = true;
                }

                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Pharmacy;

                    singletonDefinition.EventDateOrder = Mercury.Server.Application.EventDateOrder.ServiceClaimFromDate;

                    singletonDefinition.NdcCodeCriteria = CriteriaPharmacyNdcCodes.Text;

                    singletonDefinition.DrugNameCriteria = CriteriaPharmacyDrugNames.Text;

                    singletonDefinition.DeaClassificationCriteria = CriteriaPharmacyDeaClassifications.Text;

                    singletonDefinition.TherapeuticClassificationCriteria = CriteriaPharmacyTherapeuticClassifications.Text;
                }

                #endregion

                break;

            case "Lab":

                #region Lab Definition

                if (CriteriaLabLoincCodes.Text.Length != 0)
                {
                    hasValue = true;
                }


                if (hasValue)
                {
                    singletonDefinition = new Mercury.Client.Core.MedicalServices.Definitions.ServiceSingletonDefinition();

                    singletonDefinition.DataSourceType = Mercury.Server.Application.ServiceDataSourceType.Lab;

                    singletonDefinition.EventDateOrder = Mercury.Server.Application.EventDateOrder.ServiceClaimFromDate;

                    singletonDefinition.LabLoincCodeCriteria = CriteriaLabLoincCodes.Text;

                    singletonDefinition.LabValueExpressionCriteria = CriteriaLabValueExpressions.Text;

                    singletonDefinition.LabMetricId = Convert.ToInt64(CriteriaLabMetricSelection.SelectedValue);
                }

                #endregion

                break;
            } // switch

            if (singletonDefinition != null)
            {
                validationResponse = MercuryApplication.MedicalServiceSingletonDefinitionValidate(singletonDefinition);

                if (validationResponse.Count == 0)
                {
                    switch (((System.Web.UI.WebControls.Button)sender).ID)
                    {
                    case "ButtonAddDefinition": serviceSingleton.AddDefinition(singletonDefinition); break;

                    case "ButtonUpdateDefinition":

                        if (ServiceDefinitionGrid.SelectedItems.Count == 0)
                        {
                            serviceSingleton.AddDefinition(singletonDefinition);
                        }

                        else
                        {
                            singletonDefinition.ServiceSingletonDefinitionId = serviceSingleton.Definitions[ServiceDefinitionGrid.SelectedItems[0].DataSetIndex].Id;

                            serviceSingleton.Definitions.RemoveAt(ServiceDefinitionGrid.SelectedItems[0].DataSetIndex);

                            serviceSingleton.AddDefinition(singletonDefinition);

                            break;
                        }

                        break;
                    }

                    SaveResponseLabel.Text = String.Empty;
                }

                else
                {
                    foreach (String validationKey in validationResponse.Keys)
                    {
                        SaveResponseLabel.Text = "Invalid [" + validationKey + "]: " + validationResponse[validationKey];

                        break;
                    }
                }
            }

            InitializeDefinitionGrid();

            return;
        }