private async void Log(DateTime dateTimeStamp, LogLevels level, Type logInitiator, string loggedFrom, string message)
        {
            //Always verify the log level before adding a log entry.
            if (level >= _logLevel)
            {
                string methodName;

                switch (level)
                {
                    case LogLevels.All:
                        methodName = "Log";
                        break;
                    case LogLevels.Info:
                        methodName = "LogInfo";
                        break;
                    case LogLevels.Warn:
                        methodName = "LogWarn";
                        break;
                    case LogLevels.Error:
                        methodName = "LogError";
                        break;
                    case LogLevels.Fatal:
                        methodName = "LogFatal";
                        break;
                    default:
                        methodName = "LogDebug";
                        break;
                }

                StringParameters dsp = null;
                if (level == LogLevels.All)
                {
                    dsp = new StringParameters();
                    dsp.Add(new StringParameter(PARAM_NAME_LEVEL, level.ToString()));
                }

                logBase log = new logBase(dateTimeStamp, logInitiator.FullName, loggedFrom, message);

                FacadeResponse<string> fr;

                fr = await JsonFacade.SendRequest<string>(string.Format("{0}{1}", _baseAddress, methodName),
                                                          log, HTTPVerbs.POST, dsp);
            }
        }
        public async Task<bool> ValidateUserAsync(string username, string password)
        {
            if (string.IsNullOrEmpty(_validationAddress))
                return false;

            bool status = false;

            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", _apiAccessKey));
            parameters.Add(new StringParameter("username", username));
            parameters.Add(new StringParameter("password", password));

            //Status results = JsonFacade.Instance.DownloadData<Status>(
            //                            _validationAddress + "/Standard",
            //                            parameters, 
            //                            out err);

            FacadeResponse<Status> fr;

            fr = await JsonFacade.RequestData<Status>(_validationAddress + "/Standard", parameters);
            
            if (fr.Data != null)
                status = fr.Data.status;

            return status;
        }
        public async Task<bool> ValidateUserAsync(string username, string rpxProviderName, bool createAccountIfNeeded)
        {
            if (string.IsNullOrEmpty(_validationAddress))
                return false;

            ErrorDetail err;
            bool status = false;

            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", _apiAccessKey));
            parameters.Add(new StringParameter("username", username));
            parameters.Add(new StringParameter("rpxProviderName", rpxProviderName));

            //Status results = JsonFacade.Instance.DownloadData<Status>(
            //                            _validationAddress + "/OAuth",
            //                            parameters,
            //                            out err);

            FacadeResponse<Status> fr;

            fr = await JsonFacade.RequestData<Status>(_validationAddress + "/OAuth", parameters);

            if (fr.Data != null)
                status = fr.Data.status;

            return status;
        }
        public async Task<string> ResetPassword(string username)
        {
            if (string.IsNullOrEmpty(_resetPasswordAddress))
                return null;

            string retVal = string.Empty;

            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", _apiAccessKey));
            parameters.Add(new StringParameter("username", username));
            parameters.Add(new StringParameter("daysToExpire", "1"));

            try
            {
                //StringResult results = JsonFacade.Instance.UploadData<StringResult>(_resetPasswordAddress,
                //                                                                    null,
                //                                                                    out err,
                //                                                                    HTTPVerbs.PUT,
                //                                                                    parameters);

                FacadeResponse<StringResult> fr;

                fr = await JsonFacade.SendRequest<StringResult>(_resetPasswordAddress,
                                                          null, HTTPVerbs.PUT, parameters);
            
                if (fr.Data != null)
                    retVal = fr.Data.result;
            }
            catch (Exception)
            {
                retVal = null;
            }
            
            return retVal;
        }
        /// <summary>
        /// Returns a user only if the resetInfo provided is valid.
        /// </summary>
        /// <param name="resetInfo"></param>
        /// <returns></returns>
        public async Task<string> GetUserAsync(object resetInfo)
        {
            if (string.IsNullOrEmpty(_getUserByResetAddress))
                return null;
            
            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", "moto"));
            parameters.Add(new StringParameter("resetInfo", resetInfo.ToString()));

            //StringResult results = JsonFacade.Instance.DownloadData<StringResult>(_getUserByResetAddress,
            //                                                                      parameters,
            //                                                                      out err);

            FacadeResponse<StringResult> fr;

            fr = await JsonFacade.RequestData<StringResult>(_getUserByResetAddress, parameters);
            
            string retVal = string.Empty;
            if (fr.Data != null)
            {
                retVal = fr.Data.result;
            }

            return retVal;
        }
        public async Task<MembershipUser> GetUserAsync(string username, bool userIsOnline)
        {
            if (string.IsNullOrEmpty(_getUserAddress))
                return null;
            
            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", "moto"));
            parameters.Add(new StringParameter("username", username));

            //personMembership results = JsonFacade.Instance.DownloadData<personMembership>(_getUserAddress,
            //                                                                            parameters,
            //                                                                            out err);

            FacadeResponse<personMembership> fr;

            fr = await JsonFacade.RequestData<personMembership>(_getUserAddress, parameters);
            
            MembershipUser mUser = null;

            if (fr.Data != null)
            {
                mUser = new MembershipUser("AthenaMembershipProvider", fr.Data.userID, fr.Data.personID, fr.Data.userID,
                                            fr.Data.passwordQuestion, fr.Data.comment, fr.Data.isApproved, fr.Data.isLockedOut,
                                            fr.Data.creationDate, fr.Data.lastLoginDate,
                                            fr.Data.lastActivityDate, fr.Data.lastPasswordChangedDate,
                                            fr.Data.lastLockedoutDate);
            }

            return mUser;
        }
        /// <summary>
        /// Creates a user with only the basic information.
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <param name="email">Email is the same as username.  This can be left blank.</param>
        /// <param name="passwordQuestion"></param>
        /// <param name="passwordAnswer"></param>
        /// <param name="isApproved">This value is ignored</param>
        /// <param name="providerUserKey">This value is ignored.  However it is filled in when a user is successfully created.</param>
        /// <returns></returns>
        public async Task<MembershipUser> CreateUserAsync(string username, string password, 
                                                          string email, string passwordQuestion, 
                                                          string passwordAnswer, bool isApproved, 
                                                          object providerUserKey)
        {
            //All users are rejected unless the request is successful.
            MembershipCreateStatus status;
            status = MembershipCreateStatus.UserRejected;

            if (string.IsNullOrEmpty(_createUserAddress))
                return null;

            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", _apiAccessKey));
            parameters.Add(new StringParameter("username", username));
            parameters.Add(new StringParameter("password", password));
            parameters.Add(new StringParameter("passwordQuestion", passwordQuestion));
            parameters.Add(new StringParameter("passwordAnswer", passwordAnswer));

            FacadeResponse<personMembership> fr;

            fr = await JsonFacade.SendRequest<personMembership>(_createUserAddress,
                                                      null, HTTPVerbs.POST, parameters);
            
            MembershipUser mUser = null;
            
            if (fr.Data != null)
            {
                mUser = new MembershipUser("AthenaMembershipProvider", fr.Data.userID, fr.Data.personID, fr.Data.userID,
                                            fr.Data.passwordQuestion, fr.Data.comment, fr.Data.isApproved, fr.Data.isLockedOut,
                                            fr.Data.creationDate, fr.Data.lastLoginDate,
                                            fr.Data.lastActivityDate, fr.Data.lastPasswordChangedDate,
                                            fr.Data.lastLockedoutDate);
                status = (MembershipCreateStatus)fr.Data.membershipCreateStatus;
            }

            return mUser;
        }
        public async Task<bool> ChangePasswordAsync(string resetInfo, string username, string newPassword, bool reset)
        {
            if (string.IsNullOrEmpty(_changePasswordAddress))
                return false;

            bool status = false;

            StringParameters parameters = new StringParameters();
            parameters.Add(new StringParameter("accessKey", _apiAccessKey));
            parameters.Add(new StringParameter("resetInfo", resetInfo));
            parameters.Add(new StringParameter("username", username));
            parameters.Add(new StringParameter("newPassword", newPassword));
            
            FacadeResponse<Status> fr;

            fr = await JsonFacade.SendRequest<Status>(_changePasswordAddress,
                                                      null, HTTPVerbs.PUT, parameters);

            if (fr.Data.status != null)
                status = fr.Data.status;

            return status;
        }