public LevelSelectView(CurrentPlayer user)
     : base(400, 300)
 {
     BackgroundColor = new Color(255, 255, 255);
     Category = user.CurrentCategoryIndex;
     Build(user);
 }
 public void GetCurrentPlayer(Action<CurrentPlayer> callback)
 {
     jQuery.Post(
         "/api/",
         new
         {
             action = "get_current_user",
             token = token
         },
         (data, textStatus, request) =>
         {
             var jdata = JSON.Parse((string)data);
             CurrentPlayer currentPlayer = new CurrentPlayer((string)jdata["data"]["name"]);
             currentPlayer.Badges = ((string[])jdata["data"]["badges"]).Where((b) => b != "").Select((b) => (BadgeName)int.Parse(b)).ToList();
             getCategories((categories) =>
             {
                 foreach (LevelCategory category in categories)
                 {
                     currentPlayer.AddCategory(category);
                 }
                 callback(currentPlayer);
             });
         }
     );
 }
        public GameModel(CurrentPlayer user, List<Player> players)
        {
            User = user;
            Players = players;
            players.Sort(delegate(Player p1, Player p2) {
                return p2.Badges.Count.CompareTo(p1.Badges.Count);
            });

            SetLevel(User.CurrentLevelIndex, User.CurrentCategoryIndex);
        }
		public void GetCurrentPlayer(Action<CurrentPlayer> callback)
		{
			JObject response = MakeRequest ("http://webmat.cs.aau.dk/api/?action=get_current_user", true);
			JToken data = response.SelectToken ("data");

			CurrentPlayer currentPlayer = new CurrentPlayer(data.Value<string>("name"));

			JArray badges = data.SelectToken ("badges") as JArray;
			for (int j = 0; j < badges.Count; j++) {
				if (badges[j].Value<string>() != "")
					currentPlayer.Badges.Add ((BadgeName)int.Parse (badges[j].Value<string>()));
			}
			GetCategories((categories) =>
			{
				foreach (LevelCategory category in categories)
				{
					currentPlayer.AddCategory(category);
				}
				callback(currentPlayer);
			});
			callback(currentPlayer);
		}
        public void Build(CurrentPlayer user)
        {
            MenuButton = new ButtonView("Menu", () => { if (OnExit != null) { OnExit(); } })
            {
                Width = 75,
                Height = 30,
                BackgroundColor = new Color(193, 57, 43),
                TextColor = new Color(255, 255, 255),
            };

            TitelView = new CompositeView(200, 40)
            {
                X = 100,
                Y = 10,
            };
            CategoryName = new LabelView(user.Categories[Category].Name)
            {
                Width = TitelView.Width * 0.6,
                Height = TitelView.Height,
                X = TitelView.X - (TitelView.Width * 0.6) / 2
            };

            StarTextView = new LabelView("")
            {
                Width = TitelView.Width * 0.15,
                Height = 15,
                X = CategoryName.X + CategoryName.Width + 7.5,
                Y = CategoryName.Y + ((CategoryName.Height) / 2) - 7.5
            };

            StarView = new ImageView("star_activated.png", TitelView.Width * 0.10, TitelView.Width * 0.10)
            {
                X = CategoryName.X + CategoryName.Width + StarTextView.Width + 10,
                Y = CategoryName.Y + 0.5 * (TitelView.Width * 0.10)
            };

            BadgeView = new ImageView("tutorialbadge.png", TitelView.Width * 0.15, TitelView.Width * 0.15)
            {
                X = 0 - ((TitelView.Width * 0.10) / 2) + 5,
                Y = CategoryName.Y + (0.5 * (TitelView.Width * 0.15)) - 10
            };

            TitelView.Add(StarTextView);
            TitelView.Add(CategoryName);
            TitelView.Add(StarView);
            TitelView.Add(BadgeView);

            Levels = new FrameView(Width - 100, Height - (CategoryName.Y + CategoryName.Height))
            {
                X = 50,
                Y = CategoryName.Y + CategoryName.Height,
            };

            ArrowRight = new VectorImageView(345, Levels.Y + Levels.Height / 2 - 75 / 2, 50, 75)
            {
                { 0,0    },
                { 25,75/2 },
                { 0,75   },
            };

            ArrowRight.Visible = Category < user.Categories.Count - 1;
            ArrowRight.BackgroundColor = new Color(44, 119, 130);
            ArrowRight.OnClick = () =>
            {
                if (Category < user.Categories.Count - 1)
                {
                    Category++;
                    OnChanged();
                }
            };

            ArrowLeft = new VectorImageView(5, Levels.Y + Levels.Height / 2 - 75 / 2, 50, 75)
            {
                { 25,75/2 },
                { 50,0    },
                { 50,75   },
            };

            ArrowLeft.BackgroundColor = new Color(44, 119, 130);
            ArrowLeft.OnClick = () =>
            {
                if (Category > 0)
                {
                    Category--;
                    OnChanged();
                }
            };
            ArrowLeft.Visible = Category > 0;

            Children.Add(MenuButton);
            Children.Add(ArrowLeft);
            Children.Add(ArrowRight);
            Children.Add(Levels);
            Children.Add(TitelView);

            Update(user);
        }
        /// <summary>
        /// Updates the view based on the selected category. 
        /// </summary>
        /// <param name="user"></param>
        public void Update(CurrentPlayer user)
        {
            CategoryName.Text = user.Categories[Category].Name;
            ArrowLeft.Visible = Category > 0;
            ArrowRight.Visible = Category < user.Categories.Count - 1;
            int totalStars = user.Categories[Category].Count * 3;
            int userStarsInCategory = 0;

            CompositeView levelButtons = new CompositeView(400, 400);

            int levelNumber = 0;
            int numberOfLevels = user.Categories[Category].Count;
            foreach (Level level in user.Categories[Category])
            {
                // adds a button for each level in category
                userStarsInCategory += level.Stars;
                CompositeView levelButton = new CompositeView(40, 40)
                {   OnClick = () => OnLevelSelect(level),
                    X = levelNumber % (int)Math.Sqrt(numberOfLevels) * 50 + 5,
                    Y = levelNumber / (int)Math.Sqrt(numberOfLevels) * 50 + 5,
                    BackgroundColor = level.Unlocked ? new Color(40, 130, 120) : new Color(190, 190, 190)
                };
                // gives each levelbutton a level number
                levelButton.Add(
                    new LabelView((levelNumber + 1).ToString())
                    {
                        Width = levelButton.Width,
                        Height = levelButton.Width * 0.75,
                        BackgroundColor = level.Unlocked ? new Color(40, 130, 120) : new Color(190, 190, 190),
                        TextColor = new Color(255, 255, 255),
                    });
                double starsize = levelButton.Width * 0.25;
                // Centeres the stars horizontally
                double startPostition = (levelButton.Width - (starsize)) / 2;
                if (level.Stars == 2)
                {
                    startPostition = levelButton.Width / 2 - starsize;
                }
                else if (level.Stars == 3)
                {
                    startPostition = (levelButton.Width - (starsize)) / 2 - starsize;
                }
                for (int n = 0; n < level.Stars; n++)
                {
                    levelButton.Add(new ImageView("star_activated.png", starsize, starsize)
                    {
                        Y = levelButton.Height - starsize,
                        X = startPostition
                    });
                    startPostition += starsize;
                }
                levelButtons.Add(levelButton);
                levelNumber += 1;
                // finds the badge associated with the specific category
                switch (user.Categories[Category].Name)
                {
                    case "Tutorial":
                        BadgeView.Image = "tutorial_badge.png";
                        break;

                    case "Potenser":
                        BadgeView.Image = "potens_badge.png";
                        break;

                    case "Brøker":
                        BadgeView.Image = "brøkbadge.png";
                        break;

                    case "Parenteser":
                        BadgeView.Image = "parenthesis_badge.png";
                        break;

                    case "Master of Algebra":
                        BadgeView.Image = "master_of_algebrabadge.png";
                        break;
                    default:
                        break;
                }

            }
            // shows how many start the user have out of the total amount of start possible
            StarTextView.Text = userStarsInCategory + " / " + totalStars;
            levelButtons.Width = (int)Math.Sqrt(numberOfLevels) * 50;
            levelButtons.Height = levelNumber / (int)Math.Sqrt(numberOfLevels) * 50;
            Levels.SetContent(levelButtons);
        }
        public void GetCurrentPlayer(Action<CurrentPlayer> callback)
        {
            var client = new RestClient("http://webmat.cs.aau.dk/api/");

            var request = new RestRequest(Method.POST);

            request.AddParameter("action", "get_current_user");
            request.AddParameter("token", token);

            string data;

            try
            {
                data = client.Execute(request).Content;
            }
            catch (TimeoutException)
            {
                GetCurrentPlayer(callback);
                return;
            }

            JSONObject json = new JSONObject(data);
            JSONObject jsonData = json.GetJSONObject("data");
            CurrentPlayer currentPlayer = new CurrentPlayer(jsonData.GetString("name"));
            var badges = jsonData.GetJSONArray("badges");
            for (int index = 0; index < badges.Length(); index++)
            {
                string badgeString = badges.GetString(index);
                if (badgeString != "")
                {
                    currentPlayer.Badges.Add((BadgeName)int.Parse(badgeString));
                }
            }
            getCategories((categories) =>
            {
                foreach (LevelCategory category in categories)
                {
                    currentPlayer.AddCategory(category);
                }
                callback(currentPlayer);
            });
            callback(currentPlayer);

        }