Source: campaigns/default_menu/utils.js

/**
 * Various utilities.
 */
function markLevelComplete(run, levelID)
{
	if (!isCompleted(run, levelID))
	{
		if (!run.data.completedLevels)
			run.data.completedLevels = [];
		run.data.completedLevels.push(levelID);
		run.save();
	}
}

function isCompleted(run, levelID)
{
	return run.data.completedLevels && run.data.completedLevels.indexOf(levelID) !== -1;
}

function meetsRequirements(run, levelData)
{
	if (!levelData.Requires)
		return true;

	return MatchesClassList(run.data.completedLevels || [], levelData.Requires);
}