private void OnRefreshWallsCompleted(RequestUser userRequest, ResponseJson response)
        {
            if (response.value.Equals("success"))
            {
                //reset text error
                wallView.ErrorText = "";

                //save new user data in model
                string selectedWallName = wallView.SelectedWall;
                Wall selectedWallChanges = dataModel.MergeAndReturnWallChanges(response.user, selectedWallName);

                //add new messages on the selected wall if any
                foreach (Message mess in selectedWallChanges.messages)
                {
                    wallView.AddMessageToSelectedWall(mess.content, mess.author, mess.date);
                }

                //create new notifications
                ManageNewMessagesNotification(response.user);
            }
            else if (response.value.Equals("fail"))
            {
                wallView.ErrorText = response.details;
            }
            else
            {
                wallView.ErrorText = "Unexpected error";
            }
        }
        private void OnLoginUserCompleted(RequestUser userRequest, ResponseJson response)
        {
            if (response.value.Equals("success"))
            {
                //reset text error
                loginUserView.ErrorText = "";

                //create login user - response request doesn't contain usernames or passwords
                User loginUser = response.user;
                loginUser.username = userRequest.username;
                loginUser.password = userRequest.password;

                //save new user data in model
                dataModel.User = loginUser;

                //set new user data to wallView
                PopulateWallView();

                //load wallView
                parentView.CurrentChildView = wallView;
                wallView.AutoRefreshWorking = true;
            }
            else if (response.value.Equals("fail"))
            {
                loginUserView.ErrorText = response.details;
            }
            else
            {
                loginUserView.ErrorText = "Unexpected error";
            }
        }
        private void OnAddMessageCompleted(RequestUser userRequest, ResponseJson response)
        {
            if (response.value.Equals("success"))
            {
                //reset text error
                wallView.ErrorText = "";

                //save new user data in model
                dataModel.MergeUserModel(response.user);

                if (userRequest.name.Equals(wallView.SelectedWall))
                {
                    if (response.user.walls != null && response.user.walls.Count > 0 && response.user.walls[0].messages != null && response.user.walls[0].messages.Count > 0)
                    {
                        Message mess = response.user.walls[0].messages[0];
                        wallView.AddMessageToSelectedWall(mess.content, mess.author, mess.date);
                    }
                }

                wallView.NewMessageText = "";
            }
            else if (response.value.Equals("fail"))
            {
                wallView.ErrorText = response.details;
            }
            else
            {
                wallView.ErrorText = "Unexpected error";
            }
        }
        private void OnAddWallCompleted(RequestUser userRequest, ResponseJson response)
        {
            if (response.value.Equals("success"))
            {
                //reset text error
                wallView.ErrorText = "";

                //save new user data in model
                dataModel.MergeUserModel(response.user);

                if (response.user.walls != null && response.user.walls.Count > 0)
                {
                    wallView.AddNewWallName(response.user.walls[0].name);
                    wallView.SelectedWall = response.user.walls[0].name;
                }

                //wallView.NewWallNameText = "";
            }
            else if (response.value.Equals("fail"))
            {
                wallView.ErrorText = response.details;
            }
            else
            {
                wallView.ErrorText = "Unexpected error";
            }
        }
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Tuple<MyRequestMethod, RequestUser, OnRequestCompletedMethod> param = e.Argument as Tuple<MyRequestMethod, RequestUser, OnRequestCompletedMethod>;
            ResponseJson responseJson;

            try
            {
                string json;

                if (!JsonSerializer.Serialize(param.Item2, out json))
                {
                    responseJson = new ResponseJson();
                    responseJson.value = "fail";
                    responseJson.details = "Error while serializing request input json";
                    e.Result = Tuple.Create<RequestUser, ResponseJson, OnRequestCompletedMethod>(param.Item2, responseJson, param.Item3);
                    return;
                }

                string serverAdress = GetRequestAdress(param.Item1);
                HttpWebRequest webRequest = null;
                webRequest = (HttpWebRequest)WebRequest.Create(serverAdress);
                webRequest.ContentType = GetRequestContentType();
                webRequest.ContentLength = json.Length;
                webRequest.Method = GetRequestMethod(param.Item1);

                using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
                {
                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();

                    var webResponse = (HttpWebResponse)webRequest.GetResponse();
                    using (var streamReader = new StreamReader(webResponse.GetResponseStream()))
                    {
                        string response = streamReader.ReadToEnd();
                        if (!JsonSerializer.Deserialize<ResponseJson>(response, out responseJson))
                        {
                            responseJson = new ResponseJson();
                            responseJson.value = "fail";
                            responseJson.details = "Error while deserializing response output json";
                            e.Result = Tuple.Create<RequestUser, ResponseJson, OnRequestCompletedMethod>(param.Item2, responseJson, param.Item3);
                            return;
                        }

                        if (!responseJson.value.Equals("success") && !responseJson.value.Equals("fail"))
                        {
                            responseJson = new ResponseJson();
                            responseJson.value = "fail";
                            responseJson.details = "Wrong response json received from server";
                            e.Result = Tuple.Create<RequestUser, ResponseJson, OnRequestCompletedMethod>(param.Item2, responseJson, param.Item3);
                            return;
                        }

                        e.Result = Tuple.Create<RequestUser, ResponseJson, OnRequestCompletedMethod>(param.Item2, responseJson, param.Item3);
                        return;
                    }
                }
            }
            catch (Exception exception)
            {
                string error = exception.ToString();
                int pos = error.IndexOf("--->");
                if (pos != -1)
                {
                    error = error.Substring(0, pos);
                }

                responseJson = new ResponseJson();
                responseJson.value = "fail";
                responseJson.details = error;
                e.Result = Tuple.Create<RequestUser, ResponseJson, OnRequestCompletedMethod>(param.Item2, responseJson, param.Item3);
                return;
            }
        }