/// <summary>
    /// Retrieves data from SharePoint server using web services.
    /// </summary>
    /// <returns>Dataset or XmlNode</returns>
    protected object GetSharePointData()
    {
        #region "Prepare credentials for authentication"

        ICredentials credentials = null;

        // If there are data in username or password use it for authentication
        if (String.IsNullOrEmpty(Username) && String.IsNullOrEmpty(Password))
        {
            credentials = SharePointFunctions.GetSharePointCredetials();
        }
        else
        {
            credentials = SharePointFunctions.GetSharePointCredetials(Username, Password, useBase64Encoding);
        }

        #endregion


        #region "Retrieve SharePoint data"

        string serviceURL = SPServiceURL;

        // If not direct web service specified, determine web service URL by mode
        if (!serviceURL.EndsWithCSafe(".asmx", true))
        {
            // Remove trailing slash
            serviceURL = serviceURL.TrimEnd('/');

            switch (Mode.ToLowerCSafe())
            {
            case MODE_LIST_ITEMS:
            case MODE_SITE_LISTS:
                serviceURL += "/_vti_bin/lists.asmx";
                break;

            case MODE_PICTURE_LIBRARIES:
            case MODE_PICTURE_LIBRARY_ITEMS:
                serviceURL += "/_vti_bin/imaging.asmx";
                break;
            }
        }

        // Query web service
        try
        {
            Lists   spLists;
            Imaging spImaging;

            switch (Mode.ToLowerCSafe())
            {
            // Load list items
            case MODE_LIST_ITEMS:

                // Instantiate Lists service
                spLists             = new Lists(serviceURL);
                spLists.Credentials = credentials;

                camlData = LoadListItems(spLists, ListName);
                break;

            // Load site lists
            case MODE_SITE_LISTS:
                // Instantiate Lists service
                spLists             = new Lists(serviceURL);
                spLists.Credentials = credentials;

                // Get all SharePoint lists
                camlData = spLists.GetListCollection();
                break;

            // Load picture libraries
            case MODE_PICTURE_LIBRARIES:
                // Instantiate imaging service
                spImaging             = new Imaging(serviceURL);
                spImaging.Credentials = credentials;

                // Get picture libraries
                camlData = spImaging.ListPictureLibrary();
                break;

            // Load picture library items
            case MODE_PICTURE_LIBRARY_ITEMS:
                // Instantiate imaging service
                spImaging             = new Imaging(serviceURL);
                spImaging.Credentials = credentials;

                // Show error if library name empty
                if (String.IsNullOrEmpty(ListName))
                {
                    DisplayError(ResHelper.GetString("SharePoint.picslibunspecified"));
                    break;
                }

                // Get pictures in libraries, directly (not in folder)
                camlData = spImaging.GetListItems(ListName, null);
                break;
            }
        }
        catch (Exception ex)
        {
            DisplayError(ResHelper.GetString("sharepoint.erroradta") + ResHelper.Colon + " " + ex.Message);
        }


        // No data
        if (camlData == null)
        {
            return(null);
        }

        #endregion


        #region "Prepare data"

        // Use of XSLT transformation
        if (!UseClassicDataset)
        {
            dataSource = camlData;
        }
        // Use of classic dataset
        else
        {
            // Prepare dataset
            DataSet ds = new DataSet();

            // If datset fields are specified
            if (!String.IsNullOrEmpty(Fields))
            {
                DataTable dt = ds.Tables.Add();

                string[] fields = Fields.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string field in fields)
                {
                    string currentField = field.Trim();
                    if (!string.IsNullOrEmpty(currentField))
                    {
                        try
                        {
                            dt.Columns.Add(field.Trim());
                        }
                        catch (DuplicateNameException)
                        {
                            mErrorMessage = ResHelper.GetString("sharepoint.duplicateField");
                        }
                    }
                }

                XmlNodeList records = GetDataRecords(camlData);

                List <string> fieldsCheck = new List <string>();
                fieldsCheck.AddRange(fields);

                // Load items to dataset
                foreach (XmlNode record in records)
                {
                    DataRow dr = dt.NewRow();

                    // Add fields
                    foreach (string field in fields)
                    {
                        string currentField = field.Trim();
                        if (!string.IsNullOrEmpty(currentField))
                        {
                            XmlAttribute attr = record.Attributes[currentField];
                            if (attr != null)
                            {
                                dr[currentField] = attr.Value;

                                // At least one record has the field
                                fieldsCheck.Remove(field);
                            }
                        }
                    }

                    dt.Rows.Add(dr);
                }

                // None of retrieved records has fields
                if (fieldsCheck.Count > 0)
                {
                    DisplayError(String.Format(ResHelper.GetString("sharepoint.fieldnotFound"), fieldsCheck[0]));
                    return(null);
                }

                // Set daatsource
                dataSource = ds;
            }
            // No fields specified, use all fields
            else
            {
                // Only if CAML contains data record, otherwise dataset would contain wrong values
                if (HasData)
                {
                    camlData.InnerXml = SpecialCharsRegex.Replace(camlData.InnerXml, "_");
                    XmlNodeReader rd = new XmlNodeReader(camlData);
                    ds.ReadXml(rd);
                    rd.Close();

                    switch (Mode.ToLowerCSafe())
                    {
                    // Use last datatable as datasource
                    case MODE_LIST_ITEMS:

                        dataSource = ds.Tables[ds.Tables.Count - 1].DefaultView;
                        break;

                    // Filter hidden lists in dataset
                    case MODE_SITE_LISTS:
                        // Dataset structure changes based on xml, try to use last data table
                        DataTable dt = ds.Tables[ds.Tables.Count - 1];

                        // Show only visible lists
                        dt.DefaultView.RowFilter = "Hidden = 'False'";
                        dataSource = dt.DefaultView;
                        break;

                    // Dateset with picture libraries
                    case MODE_PICTURE_LIBRARIES:
                        dataSource = ds.Tables[ds.Tables.Count - 1].DefaultView;
                        break;

                    // Dataset with pictures
                    case MODE_PICTURE_LIBRARY_ITEMS:
                        dataSource = ds.Tables[ds.Tables.Count - 1].DefaultView;
                        break;
                    }
                }
            }
        }

        #endregion


        ShowRawResponse(camlData);

        return(dataSource);
    }