/// <summary>
		/// Updates the achievement.
		/// </summary>
		/// <param name='achievement'>
		/// Achievement.
		/// </param>
		/// <exception cref='NotImplementedException'>
		/// Is thrown when a requested operation is not implemented for a given type.
		/// </exception>
		public void UpdateAchievement (SGNAchievement achievement)
		{
			AchievementUpdated.Raise (this, new AchievementUpdatedEventArgs (achievement));

			if (achievement.Percent == 1) {
			
			}
		}
		/// <summary>
		/// Initialize this instance.
		/// </summary>
		public void Initialize()
		{
			m_pendingLeaderboardsUpdate = new List<SGNLeaderboard>();
			m_pendingAchievementsUpdate = new List<SGNAchievement>();
			
			// Player.
			SGNService.PlayerManager.LoggedIn += delegate(object sender, PlayerLoggedInEventArgs e) 
			{
				Log("User logged. Processing pending updates...");
				RestorePendingUpdates();
				ProcessPendingLeaderboardsUpdate();
				ProcessPendingAchievementsUpdate();
			};
			
			// Leaderboards.
			SGNService.LeaderboardManager.LeaderboardUpdating += delegate(object sender, LeaderboardUpdatingEventArgs e) 
			{
				AddPendingLeaderboardUpdate(e.Leaderboard);
			};
			
			SGNService.LeaderboardManager.LeaderboardUpdatingFailed += delegate(object sender, LeaderboardUpdatingFailedEventArgs e) 
			{
				m_currentProcessingLeaderboard = null; 
			};
			
			SGNService.LeaderboardManager.LeaderboardUpdated += delegate(object sender, LeaderboardUpdatedEventArgs e) 
			{
				RemovePendingLeaderboardUpdate(e.Leaderboard);
			};
			
			// Achievements.
			SGNService.AchievementManager.AchievementUpdating += delegate(object sender, AchievementUpdatingEventArgs e) 
			{ 
				AddPendingAchievementUpdate(e.Achievement); 
			};
			
			SGNService.AchievementManager.AchievementUpdatingFailed += delegate(object sender, AchievementUpdatingFailedEventArgs e) 
			{
				m_currentProcessingAchievement = null;
			};
			
			SGNService.AchievementManager.AchievementUpdated += delegate(object sender, AchievementUpdatedEventArgs e) 
			{
				RemovePendingAchievementUpdate(e.Achievement);
			};
			
			AppService.BackgroundBegin += delegate {
				SavePendingUpdates();
			};
		}
		/// <summary>
		/// Initializes a new instance of the
		/// <see cref="Skahal.Infrastructure.Framework.SocialGamingNetwork.AchievementsRefreshedEventArgs"/> class.
		/// </summary>
		/// <param name="achievements">Achievements.</param>
		public AchievementsRefreshedEventArgs(SGNAchievement[] achievements)
		{
			Achievements = achievements;	
		}
		/// <summary>
		/// Initializes a new instance of the
		/// <see cref="Skahal.Infrastructure.Framework.SocialGamingNetwork.AchievementUpdatingEventArgs"/> class.
		/// </summary>
		/// <param name="achievement">Achievement.</param>
		public AchievementUpdatingEventArgs(SGNAchievement achievement)
		{
			Achievement = achievement;
		}
		void ProcessPendingAchievementsUpdate()
		{
			lock (this)
			{
				var count = m_pendingAchievementsUpdate.Count;
				
				Log("There are {0} pending achievements update.", count);
				
				if (m_currentProcessingAchievement == null && count > 0)
				{
					m_currentProcessingAchievement = m_pendingAchievementsUpdate[0];
					
					Log("Updating pending achievement {0} update.", m_currentProcessingAchievement);
					
					SGNService.AchievementManager.UpdateAchievement(m_currentProcessingAchievement);
				}
			}
		}
		void RemovePendingAchievementUpdate(SGNAchievement achievement)
		{
			lock (this)
			{
				Log("Removing achievement {0} as pending update...", achievement);
				
				m_pendingAchievementsUpdate.Remove(achievement);
				
				if (achievement.Equals(m_currentProcessingAchievement))
				{
					m_currentProcessingAchievement = null;
				}
			}
		}
		void AddPendingAchievementUpdate(SGNAchievement achievement)
		{
			lock (this)
			{
				Log("Adding achievement {0} as pending update...", achievement);
				
				if (m_pendingAchievementsUpdate.Contains(achievement))
				{
					m_pendingAchievementsUpdate.Remove(achievement);
				}
				
				m_pendingAchievementsUpdate.Add(achievement);
			}
		}
		void RestorePendingUpdates()
		{
			if (m_pendingUpdatesRestored)
			{
				return;
			}
			
			// Leaderboards.
			var data = UserService.GetPreference(GetLeaderboardsPlayerPrefsKey(), "").Value.ToString();
			
			if (!String.IsNullOrEmpty(data))
			{
				var leaderboards = data.Split(';');
				
				foreach (var l in leaderboards)
				{
					var parts = l.Split('|');
					if (parts.Length == 2)
					{
						var leaderboard = new SGNLeaderboard(parts[0]);
						leaderboard.Score = Convert.ToInt64(parts[1]);
						AddPendingLeaderboardUpdate(leaderboard);
					}
				}
			}
			
			// Achievements.
			data = UserService.GetPreference(GetAchievementsPlayerPrefsKey(), "").ToString();
			
			if (!String.IsNullOrEmpty(data))
			{
				var achievements = data.Split(';');
				
				foreach (var l in achievements)
				{
					var parts = l.Split('|');
					
					if (parts.Length == 2)
					{
						var achievement = new SGNAchievement(parts[0]);
						achievement.Percent = Convert.ToSingle(parts[1]);
						m_pendingAchievementsUpdate.Add(achievement);
					}
				}
			}
			
			m_pendingUpdatesRestored = true;
		}
		/// <summary>
		/// Initializes a new instance of the
		/// <see cref="Skahal.Infrastructure.Framework.SocialGamingNetwork.AchievementUnlockedEventArgs"/> class.
		/// </summary>
		/// <param name="achievement">Achievement.</param>
		public AchievementUnlockedEventArgs(SGNAchievement achievement)
		{
			Achievement = achievement;
		}