//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        #endregion

        #region Public Query method
        //===================================================================================
        /// <summary>
        /// This method executes a query
        /// </summary>
        /// <param name="QueryData"> Evado.Integration.Model.EiData wiht query parameters.</param>
        /// <returns> Evado.Integration.Model.EiData object</returns>
        //-----------------------------------------------------------------------------------
        public Evado.Integration.Model.EiData ProcessQuery(
            Evado.Integration.Model.EiData QueryData)
        {
            this.LogMethod("ProcessQuery method.");
            this.LogDebug("Settings.LoggingLevel: " + this.ClassParameters.LoggingLevel);
            this.LogDebug("QueryType: " + QueryData.QueryType);
            this.writeProcessLog("Integration Service - Commence processing query data.");
            //
            // Initialise the methods variables and objects.
            //
            Evado.Integration.Model.EiData        resultData      = new  Evado.Integration.Model.EiData( );
            Evado.Digital.Model.EdQueryParameters queryParameters =
                new Evado.Digital.Model.EdQueryParameters( );

            //
            // Validate that the query data has parameters.
            //
            if (QueryData.ParameterList == null)
            {
                this.writeProcessLog("Integration Service - Project identifier not provided.");
                this.LogDebug("Parameter list is null.");

                resultData.EventCode    = Evado.Integration.Model.EiEventCodes.Integration_Import_Parameter_Error;
                resultData.ErrorMessage = "Integration Service - Parameter list is empty.";
                return(resultData);
            }
            if (QueryData.ParameterList.Count == 0)
            {
                this.writeProcessLog("Integration Service - Parameter list is empty.");
                this.LogDebug("Parameter list is empty.");

                resultData.EventCode    = Evado.Integration.Model.EiEventCodes.Integration_Import_Parameter_Error;
                resultData.ErrorMessage = "Integration Service - Parameter list is empty.";
                return(resultData);
            }

            string projectid = QueryData.GetQueryParameterValue(Evado.Integration.Model.EiQueryParameterNames.Project_Id);


            //
            // select the query QueryType
            //
            switch (QueryData.QueryType)
            {
            default:
            {
                resultData.EventCode    = EiEventCodes.Integration_Import_Type_Id_Error;
                resultData.ErrorMessage = Evado.Model.EvStatics.enumValueToString(EiEventCodes.Integration_Import_Type_Id_Error);
                break;
            }
            }

            this.LogMethodEnd("ProcessQuery");
            return(resultData);
        }//END Query method.
        }//END ImportCsvData method.

        //===================================================================================
        /// <summary>
        /// This method executes a CSV import or export query.
        /// </summary>
        /// <param name="UserProfile">Evado.Digital.Model.EdUserProfile object.</param>
        /// <param name="QueryType">EiQueryTypes: Csv encoded data object.</param>
        /// <param name="CsvDataList">List of String: Csv encoded data object.</param>
        /// <returns> Evado.Integration.Model.EiData object</returns>
        //-----------------------------------------------------------------------------------
        public Evado.Integration.Model.EiData ImportData(
            Evado.Digital.Model.EdUserProfile UserProfile,
            EiQueryTypes QueryType,
            List <String> CsvDataList)
        {
            this.LogMethod("ImportData method.");
            this.LogDebug("UserProfile: " + UserProfile.CommonName);
            this.LogDebug("QueryType: " + QueryType);
            this.writeProcessLog("CSV Import Service - Commence processing query data.");
            //
            // Initialise the methods variables and objects.
            //
            Evado.Integration.Model.EiData        resultData      = new  Evado.Integration.Model.EiData( );
            Evado.Digital.Model.EdQueryParameters queryParameters =
                new Evado.Digital.Model.EdQueryParameters( );

            //
            // Get extract the data from the CSV file.
            //
            EiData ImportData = this.getDataObjectFromCsv(
                CsvDataList,
                QueryType);

            /*
             * if ( this.Settings.LoggingLevel > 4 )
             * {
             * foreach ( EiColumnParameters parm in ImportData.Columns )
             * {
             *  string content = String.Format ( "Parm: Field: {0}, Type: {1}, Index: {2}", parm.EvadoFieldId, parm.DataType, parm.Index );
             *  this.LogValue ( content );
             * }
             * }
             */

            //
            // Execute the query.
            //
            resultData = EI_Services.ProcessQuery(ImportData);

            this.LogClass(EI_Services.Log);

            this._ProcessLog.AppendLine(resultData.ProcessLog);

            this.LogMethodEnd("ImportData");
            return(resultData);
        }//END ImportCsvData method.
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        #endregion

        #region Public Query method

        //===================================================================================
        /// <summary>
        /// This method executes a CSV import or export query.
        /// </summary>
        /// <param name="QueryData"> Evado.Integration.Model.EiData.</param>
        /// <returns>List of String</returns>
        //-----------------------------------------------------------------------------------
        public List <String> ExportData(
            Evado.Integration.Model.EiData QueryData)
        {
            this.LogMethod("ExportData method.");
            this.LogDebug("QueryType: " + QueryData.QueryType);
            this.writeProcessLog("CSV Export Service - Commence processing query data.");
            //
            // Initialise the methods variables and objects.
            //
            Evado.Integration.Model.EiData        resultData      = new  Evado.Integration.Model.EiData( );
            Evado.Digital.Model.EdQueryParameters queryParameters =
                new Evado.Digital.Model.EdQueryParameters( );
            List <String> CsvOutput = new List <string> ( );

            //
            // Query the Ei service
            //
            resultData = EI_Services.ProcessQuery(QueryData);

            this.LogClass(EI_Services.Log);

            this._ProcessLog.AppendLine(resultData.ProcessLog);

            if (resultData.DataRows == null)
            {
                this.LogDebug("No data was generated by the query.");
                this.writeProcessLog("No data was generated by the query.");
                return(new List <string> ( ));
            }
            //
            // Convert the result data object into a CSV file.
            //
            var result = this.getCsvFromDataObject(resultData);

            this.LogMethodEnd("ExportData");

            return(result);
        }//END ImportCsvData method.
        }     //END getFormFieldColumns method

        //===================================================================================
        /// <summary>
        /// This method appends the column objects for a list of form fields.
        /// </summary>
        /// <param name="Field">Evado.Digital.Model.EvFormField object</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        /// <param name="Row"> Evado.Integration.Model.EiDataRow object</param>
        //-----------------------------------------------------------------------------------
        private void getCheckBoxFieldColumnValues(
            Evado.Digital.Model.EdRecordField Field,
            Evado.Integration.Model.EiData ResultData,
            Evado.Integration.Model.EiDataRow Row)
        {
            this.LogMethod("getCheckBoxFieldColumnValues method.");
            //
            // Iterate through the list of checkbox options
            //
            for (int count = 0; count < Field.Design.OptionList.Count; count++)
            {
                //
                // get the option
                //
                Evado.Model.EvOption option = Field.Design.OptionList [count];

                string fieldId = Field.FieldId + "_" + count + "_" + option.Value;

                //
                // Set the checkbox listing output.
                //
                int column = ResultData.getColumnNo(fieldId);

                this.writeProcessLog("Column: " + column + ",\t FieldId: " + fieldId + ", Type: " + Field.TypeId + ", Value: " + Field.ItemValue);

                if (column > -1)
                {
                    if (Field.ItemValue.Contains(option.Value) == true)
                    {
                        Row.updateValue(column, "True");
                    }
                    else
                    {
                        Row.updateValue(column, "False");
                    }
                }
            } //END option iteration loop.
        }     //END getFormFieldColumns method
        }         //END getFormFieldColumns

        //===================================================================================
        /// <summary>
        /// This method appends the column objects for a list of form fields.
        /// </summary>
        /// <param name="Field">Evado.Digital.Model.EvFormField object</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        //-----------------------------------------------------------------------------------
        //private void getCheckBoxFieldColumn (
        public void getCheckBoxFieldColumn(
            Evado.Digital.Model.EdRecordField Field,
            Evado.Integration.Model.EiData ResultData)
        {
            this.LogMethod("getCheckBoxFieldColumn method.");
            //
            // Iterate through the list of checkbox options
            //
            for (int count = 0; count < Field.Design.OptionList.Count; count++)
            {
                //
                // get the option
                //
                Evado.Model.EvOption option = Field.Design.OptionList [count];

                //
                //The default data type is text.
                //
                ResultData.AddColumn(
                    Evado.Integration.Model.EiDataTypes.Boolean,
                    Field.FieldId + "_" + count + "_" + option.Value);
            } //END option iteration loop.
        }     //END getFormFieldColumns method
        }         //END getTableFieldColumn method.

        //===================================================================================
        /// <summary>
        /// This method appends the column objects for a list of form fields.
        /// </summary>
        /// <param name="Field">Evado.Digital.Model.EvFormField object</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        /// <param name="Row"> Evado.Integration.Model.EiDataRow object</param>
        //-----------------------------------------------------------------------------------
        //private void getTableFieldColumnValues (
        public void getTableFieldColumnValues(
            Evado.Digital.Model.EdRecordField Field,
            Evado.Integration.Model.EiData ResultData,
            Evado.Integration.Model.EiDataRow Row)
        {
            this.LogMethod("getTableFieldColumnValues method.");
            //
            // Iterate through the table columns
            //
            for (int tableRow = 0; tableRow < Field.Table.Rows.Count; tableRow++)
            {
                int row = tableRow + 1;
                //
                // Iterate through the table columns
                //
                for (int tableColumn = 0; tableColumn < Field.Table.Header.Length; tableColumn++)
                {
                    int column = tableColumn + 1;

                    //
                    // Skip empty header text.
                    //
                    if (Field.Table.Header [tableColumn].Text == String.Empty)
                    {
                        continue;
                    }

                    //
                    // Define the output field identifier.
                    //
                    string fieldId = Field.FieldId + "_" + row + "_" + column + "_" + Field.Table.Header [tableColumn].Text;

                    //
                    // Set the checkbox listing output.
                    //
                    int headerColumn = ResultData.getColumnNo(fieldId);
                    //

                    // Header column found
                    //
                    if (headerColumn > -1)
                    {
                        string value = Field.Table.Rows [tableRow].Column [tableColumn];

                        this.LogDebug("Column: " + headerColumn + ",\t FieldId: " + fieldId + ", Type: " + Field.TypeId + ", Value: " + value);

                        //
                        // data type switch to handle boolean values.
                        //
                        switch (Field.Table.Header [tableColumn].TypeId)
                        {
                        case Evado.Model.EvDataTypes.Yes_No:
                        case Evado.Model.EvDataTypes.Boolean:
                        {
                            if (value == "yes" || value == "1" || value == "true")
                            {
                                Row.updateValue(headerColumn, "True");
                            }
                            else
                            {
                                Row.updateValue(headerColumn, "False");
                            }
                            break;
                        }

                        default:
                        {
                            Row.updateValue(headerColumn, value);
                            break;
                        }
                        } //END data type switch
                    }     //END header column index found
                }         //END table column header iteration loop
            }             //END table row  iteration loop
        }                 //END getTableFieldColumn method.
        }     //END getFormFieldColumns method

        //===================================================================================
        /// <summary>
        /// This method appends the column objects for a list of form fields.
        /// </summary>
        /// <param name="Field">Evado.Digital.Model.EvFormField object</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        //-----------------------------------------------------------------------------------
        //private void getTableFieldColumn (
        public void getTableFieldColumn(
            Evado.Digital.Model.EdRecordField Field,
            Evado.Integration.Model.EiData ResultData)
        {
            this.LogMethod("getTableFieldColumn method.");
            //
            // Iterate through the table columns
            //
            for (int tableRow = 0; tableRow < Field.Table.Header.Length; tableRow++)
            {
                int row = tableRow + 1;
                //
                // Iterate through the table columns
                //
                for (int tableColumn = 0; tableColumn < Field.Table.Header.Length; tableColumn++)
                {
                    int column = tableColumn + 1;
                    //
                    // get the column text header.
                    //
                    String title = Field.Table.Header [tableColumn].Text;

                    //
                    // Skip empty header text.
                    //
                    if (title == String.Empty)
                    {
                        continue;
                    }

                    //
                    // Defne the parameter.
                    //
                    Evado.Integration.Model.EiColumnParameters parameter = new  Evado.Integration.Model.EiColumnParameters(
                        Evado.Integration.Model.EiDataTypes.Text,
                        Field.FieldId + "_" + row + "_" + column + "_" + title);

                    switch (Field.Table.Header [tableColumn].TypeId)
                    {
                    case  Evado.Model.EvDataTypes.Numeric:
                    {
                        parameter.DataType = Evado.Integration.Model.EiDataTypes.Floating_Point;
                        break;
                    }

                    case  Evado.Model.EvDataTypes.Date:
                    {
                        parameter.DataType = Evado.Integration.Model.EiDataTypes.Date;
                        break;
                    }

                    case  Evado.Model.EvDataTypes.Yes_No:
                    case  Evado.Model.EvDataTypes.Boolean:
                    {
                        parameter.DataType = Evado.Integration.Model.EiDataTypes.Boolean;
                        break;
                    }
                    }//END data type switch

                    //
                    //The default data type is text.
                    //
                    ResultData.Columns.Add(parameter);
                } //END table column header iteration loop
            }     //END table row  iteration loop
        }         //END getTableFieldColumn method.
        }         //END getFormFieldColumns

        //===================================================================================
        /// <summary>
        /// This method appends the form field data values to the output row .
        /// </summary>
        /// <param name="FieldList">List of Evado.Digital.Model.EvFormField objects</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        /// <param name="Row"> Evado.Integration.Model.EiDataRow object</param>
        //-----------------------------------------------------------------------------------
        // private void getFormFieldColumnData (
        public void getFormFieldColumnData(
            List <Evado.Digital.Model.EdRecordField> FieldList,
            Evado.Integration.Model.EiData ResultData,
            Evado.Integration.Model.EiDataRow Row)
        {
            this.LogMethod("getFormFieldColumnData method.");
            //
            // Initialise the method variables and objects.
            //
            int column = 0;

            //
            // Iterate through the field list creating column object for each field object.
            //
            foreach (Evado.Digital.Model.EdRecordField field in FieldList)
            {
                //
                // add the correct column type for the field data type.
                //
                switch (field.TypeId)
                {
                case Evado.Model.EvDataTypes.Boolean:
                {
                    String value = "False";

                    if (field.ItemValue == "yes" ||
                        field.ItemValue == "yes")
                    {
                        value = "True";
                    }

                    column = ResultData.getColumnNo(field.FieldId);

                    this.writeProcessLog("Column: " + column + ",\t FieldId: " + field.FieldId + ", Type: " + field.TypeId + ", Value: " + field.ItemValue);

                    if (column > -1)
                    {
                        Row.updateValue(column, value.ToString( ));
                    }
                    break;
                }

                case Evado.Model.EvDataTypes.Free_Text:
                {
                    column = ResultData.getColumnNo(field.FieldId);

                    this.writeProcessLog("Column: " + column + ",\t FieldId: " + field.FieldId + ", Type: " + field.TypeId + ", Value: " + field.ItemValue);

                    String text = field.ItemText.Replace("\r", "^");
                    text = text.Replace("\n", "^");
                    text = text.Replace("^^", "^");

                    Row.updateValue(column, text);

                    break;
                }

                case Evado.Model.EvDataTypes.Check_Box_List:
                {
                    this.getCheckBoxFieldColumnValues(field, ResultData, Row);
                    break;
                }

                case Evado.Model.EvDataTypes.Table:
                case Evado.Model.EvDataTypes.Special_Matrix:
                {
                    this.getTableFieldColumnValues(field, ResultData, Row);
                    break;
                }

                default:
                {
                    column = ResultData.getColumnNo(field.FieldId);

                    this.writeProcessLog("Column: " + column + ",\t FieldId: " + field.FieldId + ", Type: " + field.TypeId + ", Value: " + field.ItemValue);

                    if (column > -1)
                    {
                        Row.updateValue(column, field.ItemValue);
                    }
                    break;
                }
                } //END data type switch
            }     //END field iteration loop
        }         //END getFormFieldColumns
        }//END Query method.

        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        #endregion

        #region general form field methods.

        //===================================================================================
        /// <summary>
        /// This method appends the column objects for a list of form fields.
        /// </summary>
        /// <param name="FieldList">List of Evado.Digital.Model.EvFormField objects</param>
        /// <param name="ResultData"> Evado.Integration.Model.EiData object</param>
        //-----------------------------------------------------------------------------------
        public void getFormFieldColumns(
            List <Evado.Digital.Model.EdRecordField> FieldList,
            Evado.Integration.Model.EiData ResultData)
        {
            this.LogMethod("getFormFieldColumns method.");
            this.LogDebug("FieldList.Count: " + FieldList.Count);

            //
            // Iterate through the field list creating column object for each field object.
            //
            foreach (Evado.Digital.Model.EdRecordField field in FieldList)
            {
                this.LogDebug("Field: " + field.FieldId + ", Type: " + field.TypeId);
                //
                // add the correct column type for the field data type.
                //
                switch (field.TypeId)
                {
                case Evado.Model.EvDataTypes.Boolean:
                {
                    this.LogDebug("ADD: Boolean Column");
                    //
                    //The default data type is text.
                    //
                    ResultData.AddColumn(
                        Evado.Integration.Model.EiDataTypes.Boolean,
                        field.FieldId);

                    break;
                }

                case Evado.Model.EvDataTypes.Numeric:
                {
                    this.LogDebug("ADD: Floating_Point Column");
                    //
                    //The default data type is text.
                    //
                    ResultData.AddColumn(
                        Evado.Integration.Model.EiDataTypes.Floating_Point,
                        field.FieldId);

                    break;
                }

                case Evado.Model.EvDataTypes.Date:
                {
                    this.LogDebug("ADD: DateTime Column");
                    //
                    //The default data type is text.
                    //
                    ResultData.AddColumn(
                        Evado.Integration.Model.EiDataTypes.Date,
                        field.FieldId);

                    break;
                }

                case Evado.Model.EvDataTypes.Check_Box_List:
                {
                    this.LogDebug("ADD: Check_Button_List columns");

                    this.getCheckBoxFieldColumn(field, ResultData);

                    break;
                }

                case Evado.Model.EvDataTypes.Table:
                case Evado.Model.EvDataTypes.Special_Matrix:
                {
                    this.LogDebug("ADD: Table columns");

                    this.getTableFieldColumn(field, ResultData);

                    break;
                }

                default:
                {
                    this.LogDebug("ADD: Text Column");
                    //
                    //The default data type is text.
                    //
                    ResultData.Columns.Add(new  Evado.Integration.Model.EiColumnParameters(
                                               Evado.Integration.Model.EiDataTypes.Text,
                                               field.FieldId));
                    break;
                }
                } //END data type switch
            }     //END field iteration loop
        }         //END getFormFieldColumns