function formatPopupNotification(input, notificationId)
{
	// make sure hyphen is escaped inside square brackets
	var pattern1 = /<span class="nitroNotificationTitle">([\?:"'\w\s\|\!\-]+)<\/span>/i;
	var pattern2 = /<span class="nitroNotificationMessage">([\?:"'\{\}\!\._,\w\s\|\-]+)<\/span>/i;
	var pattern3 = /<span class="nitroNotificationData">([\?:"'=\w\s\|\-]+)<\/span>/i; // ([=\w\s\|\-]+)
	var notificationMessage = null;
	var notificationData = null;
	
	var patternMatch2 = input.match(pattern2);
	if (patternMatch2)
	{
		notificationMessage = patternMatch2[1];
	}
	
	var patternMatch3 = input.match(pattern3);
	if (patternMatch3)
	{
		notificationData = patternMatch3[1];	  
	}
		
	if (notificationId == 'user_challenge_invite' || notificationId == 'user_challenge_results')
	{
		var profileUUID = '$personUUID';
		if (sn_currentUserData != undefined)
		{
			var viewerUUID = sn_currentUserData.a;
		}
		else
		{
			var viewerUUID = 'anonymous';
		}
		
		if (!notificationData)
		{
			return;
		}
		
		var dataArray = notificationData.split('|||');
		var nitro_winnerUUID = dataArray[0];
		var nitro_winnerFirstName = dataArray[1];
		var nitro_winnerValue = parseInt(dataArray[2]);
		var nitro_winnerPoints = parseInt(dataArray[3]);
		var nitro_loserUUID = dataArray[4];
		var nitro_loserFirstName = dataArray[5];
		var nitro_loserValue = parseInt(dataArray[6]);
		var nitro_loserPoints = parseInt(dataArray[7]);
		var nitro_customDataArray = dataArray[9].split('===');
		var nitro_competitionID = dataArray[8];
		
		var nitro_challengerUUID = nitro_customDataArray[0];
		var nitro_gameUUID = nitro_customDataArray[1];
		var nitro_gameTitle = nitro_customDataArray[3];
		var nitro_gameURL = nitro_customDataArray[2];
		
		var challenger = '';
		var challengerURL = '';
		var opponent = '';
		var opponentURL = '';
		var challengerPoints = '';
		var opponentPoints = '';
		
		if (nitro_winnerUUID == nitro_challengerUUID)
		{
			challenger = nitro_winnerFirstName;
			challengerURL = '/' + challenger;
			opponent = nitro_loserFirstName;
			opponentURL = '/' + opponent;
			challengerPoints = String(nitro_winnerValue);
			opponentPoints = String(nitro_loserValue);
			
			if (viewerUUID == nitro_winnerUUID)
			{
				challenger = 'You';
			}
			else if (viewerUUID == nitro_loserUUID)
			{
				opponent = 'You';
			}
		}
		else
		{
			challenger = nitro_loserFirstName;
			challengerURL = '/' + challenger;
			opponent = nitro_winnerFirstName;
			opponentURL = '/' + opponent;
			challengerPoints = String(nitro_loserValue);
			opponentPoints = String(nitro_winnerValue);
			
			if (viewerUUID == nitro_winnerUUID)
			{
				opponent = 'You';
			}
			else if (viewerUUID == nitro_loserUUID)
			{
				challenger = 'You';
			}
		}
		
		if (notificationId == 'user_challenge_invite')
		{
			// invite
			var msg = notificationMessage.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
			msg = msg.replace('{carc_score}', challengerPoints);
			msg = msg.replace('{carc_challenger}', '<a href="' + challengerURL + '">' + challenger + '</a>');
			msg = msg.replace('{carc_opponent}', '<a href="' + opponentURL + '">' + opponent + '</a>');
			input = input.replace(pattern2, '<span class="nitroNotificationMessage">' + msg + '</span>');
			
			return input;
		}
		else
		{
			// result
			var pattern1a = /<span class="nitroNotificationTitle_Tie">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			var pattern1b = /<span class="nitroNotificationTitle_Win">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			var pattern1c = /<span class="nitroNotificationTitle_Lose">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			var pattern2a = /<span class="nitroNotificationMessage_Tie">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			var pattern2b = /<span class="nitroNotificationMessage_Win">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			var pattern2c = /<span class="nitroNotificationMessage_Lose">(['"\{\}\!\._,\w\s\|\-]+)<\/span>/i;
			
			var patternMatch2a = input.match(pattern2a);
			if (patternMatch2a)
			{
				var notificationMessageTie = patternMatch2a[1];
			}
			
			var patternMatch2b = input.match(pattern2b);
			if (patternMatch2b)
			{
				var notificationMessageWin = patternMatch2b[1];
			}
			
			var patternMatch2c = input.match(pattern2c);
			if (patternMatch2c)
			{
				var notificationMessageLose = patternMatch2c[1];
			}
			
			if (nitro_winnerValue == nitro_loserValue)
			{
				// tie
				input = input.replace(pattern1a, '<span class="nitroNotificationTitle">$1</span>');
				input = input.replace(pattern1b, '');
				input = input.replace(pattern1c, '');
				
				var msg = notificationMessageTie; 
				msg = msg.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
				msg = msg.replace('{carc_challenger}', '<a href="' + challengerURL + '">' + challenger + '</a>');
				msg = msg.replace('{carc_opponent}', '<a href="' + opponentURL + '">' + opponent + '</a>');
				msg = msg.replace('{carc_challengerScore}', challengerPoints);
				input = input.replace(pattern2a, '<span class="nitroNotificationMessage">' + msg + '</span>');
				input = input.replace(pattern2b, '');
				input = input.replace(pattern2c, '');
				
				//nitro_winnerPoints;
				
				return input;
			}
			else
			{
				// someone won
				var points = null;
				if (sn_currentUserData.a == nitro_winnerUUID)
				{
					input = input.replace(pattern1a, '');
					input = input.replace(pattern1b, '<span class="nitroNotificationTitle">$1</span>');
					input = input.replace(pattern1c, '');
					
					var msg = notificationMessageWin; 
					msg = msg.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
					msg = msg.replace('{carc_challenger}', '<a href="' + challengerURL + '">' + challenger + '</a>');
					msg = msg.replace('{carc_opponent}', '<a href="' + opponentURL + '">' + opponent + '</a>');
					msg = msg.replace('{carc_challengerScore}', challengerPoints);
					msg = msg.replace('{carc_opponentScore}', opponentPoints);
					
					if (sn_currentUserData.a != nitro_challengerUUID)
					{
						msg = msg.replace('won', 'lost');
					}
					
					input = input.replace(pattern2a, '');
					input = input.replace(pattern2b, '<span class="nitroNotificationMessage">' + msg + '</span>');
					input = input.replace(pattern2c, '');
					
					points = nitro_winnerPoints;
				}
				else
				{
					input = input.replace(pattern1a, '');
					input = input.replace(pattern1b, '');
					input = input.replace(pattern1c, '<span class="nitroNotificationTitle">$1</span>');
					
					var msg = notificationMessageLose;
					msg = msg.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
					msg = msg.replace('{carc_challenger}', '<a href="' + challengerURL + '">' + challenger + '</a>');
					msg = msg.replace('{carc_opponent}', '<a href="' + opponentURL + '">' + opponent + '</a>');
					msg = msg.replace('{carc_challengerScore}', challengerPoints);
					msg = msg.replace('{carc_opponentScore}', opponentPoints);
					
					if (sn_currentUserData.a != nitro_challengerUUID)
					{
						msg = msg.replace('lost', 'won');
					}
					
					input = input.replace(pattern2a, '');
					input = input.replace(pattern2b, '');
					input = input.replace(pattern2c, '<span class="nitroNotificationMessage">' + msg + '</span>');
					
					points = nitro_loserPoints;
				}
				
				// points;
				return input;
			}
		}
	}
	else if (notificationId == 'score_user_beat_overall_high_today')	
	{
		if (!notificationData)
		{
			return;
		}
		var dataArray = notificationData.split('===');
		var nitro_gameUUID = dataArray[0];
		var nitro_gameTitle = dataArray[1];
		var nitro_gameURL = dataArray[2];
		var nitro_oldHighScore = dataArray[4];
		var nitro_oldHighScoreUser = dataArray[3];
		var nitro_newHighScore = dataArray[5];
		
		var msg = notificationMessage.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
		msg = msg.replace('{carc_oldHighScore}', nitro_oldHighScore);
		msg = msg.replace('{carc_oldHighScoreUsername}', '<a href="/' + nitro_oldHighScoreUser + '">' + nitro_oldHighScoreUser + '</a>');
		msg = msg.replace('{carc_newHighScore}', nitro_newHighScore);
		input = input.replace(pattern2, '<span class="nitroNotificationMessage">' + msg + '</span>');
		
		return input;
	}
	else if (notificationId == 'score_user_beat_overall_high')	 
	{
		if (!notificationData)
		{
			return;
		}
		var dataArray = notificationData.split('===');
		var nitro_gameUUID = dataArray[0];
		var nitro_gameTitle = dataArray[1];
		var nitro_gameURL = dataArray[2];
		var nitro_newHighScore = dataArray[3];
		
		var msg = notificationMessage.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
		msg = msg.replace('{carc_newHighScore}', nitro_newHighScore);
		input = input.replace(pattern2, '<span class="nitroNotificationMessage">' + msg + '</span>');
		
		return input;
	}
	else if (notificationId == 'score_user_beat_personal_high')
	{
		if (!notificationData)
		{
			return;
		}
		var dataArray = notificationData.split('===');
		var nitro_gameUUID = dataArray[0];
		var nitro_gameTitle = dataArray[1];
		var nitro_gameURL = dataArray[2];
		var nitro_oldHighScore = dataArray[3];
		var nitro_newHighScore = dataArray[4];
				
		var msg = notificationMessage.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
		msg = msg.replace('{carc_newHighScore}', nitro_newHighScore);
		msg = msg.replace('{carc_oldHighScore}', nitro_oldHighScore);
		input = input.replace(pattern2, '<span class="nitroNotificationMessage">' + msg + '</span>');
	
		return input;
	}
	else if (notificationId == 'score_user_lost_overall_high' || notificationId == 'score_user_lost_overall_high_today')
	{
		if (!notificationData)
		{
			return;
		}

		var dataArray = notificationData.split('===');
		var nitro_gameUUID = dataArray[0];
		var nitro_gameTitle = dataArray[1];
		var nitro_gameURL = dataArray[2];
		var nitro_oldHighScore = dataArray[5];
		var nitro_newHighScore = dataArray[3];
		var nitro_newHighScoreUser = dataArray[4];

		var msg = notificationMessage.replace('{carc_game}', '<a href="/games/' + nitro_gameURL + '">' + nitro_gameTitle + '</a>');
		msg = msg.replace('{carc_newHighScore}', nitro_newHighScore);
		msg = msg.replace('{carc_oldHighScore}', nitro_oldHighScore);
		msg = msg.replace('{carc_newHighScoreUsername}', '<a href="/' + nitro_newHighScoreUser + '">' + nitro_newHighScoreUser + '</a>');
		input = input.replace(pattern2, '<span class="nitroNotificationMessage">' + msg + '</span>');
		
		return input;
	}
	else
	{
		// simple notification
		return input;
	}
}

function formatPopupNotifications(notification, asyncToken)
{
	var pattern1 = /<span class="nitroNotificationId">([\w\s\|\-]+)<\/span>/i;
	var patternMatch1 = (notification.html).match(pattern1);
	if (!patternMatch1)
	{
		var notificationId = '';
	}
	else
	{
		var notificationId = patternMatch1[1];
	}
	
	notification.html = formatPopupNotification(notification.html, notificationId);
}
