function initMusic()
{
	// Probably will need to put this in a place where it won't get
	// reinitialized after every match. Otherwise, it will not remember
	// the current track

	// Might need to use pregame for that sort of setup and move all the
	// menu stuff to a main_menu page

	if (!global.music)
		global.music = new Music();
}


// =============================================================================
// Music class for handling music states (requires onTick)
// =============================================================================
function Music()
{
	this.reference = this;

	this.RELATIVE_MUSIC_PATH = "audio/music/";
	this.MUSIC = {
		PEACE: "peace",
		BATTLE: "battle",
		VICTORY: "victory",
		DEFEAT: "defeat"
	};

	this.resetTracks();

	this.states = {
		OFF : 0,
		MENU : 1,
		PEACE : 2,
		BATTLE : 3,
		VICTORY : 4,
		DEFEAT : 5
	};

	this.musicGain = 0.3;

	this.currentState = 0;
	this.oldState = 0;

	// timer for delay between tracks
	this.timer = [];
	this.time = Date.now();
}

Music.prototype.resetTracks = function()
{
	this.tracks = {
		MENU: ["Honor_Bound.ogg"],
		PEACE: [],
		BATTLE: ["Taiko_1.ogg", "Taiko_2.ogg"],
		VICTORY : ["You_are_Victorious!.ogg"],
		DEFEAT : ["Dried_Tears.ogg"]
	};
};

// "reference" refers to this instance of Music (needed if called from the timer)
Music.prototype.setState = function(state)
{
	this.reference.currentState = state;
	this.updateState();
};

Music.prototype.updateState = function()
{
	if (this.currentState != this.oldState)
	{
		this.oldState = this.currentState;

		switch (this.currentState)
		{
		case this.states.OFF:
			Engine.StopMusic();
			break;

		case this.states.MENU:
			this.switchMusic(this.getRandomTrack(this.tracks.MENU), 0.0, true);
			break;

		case this.states.PEACE:
			this.startPlayList(this.tracks.PEACE, 3.0, true);
			break;

		case this.states.BATTLE:
			this.startPlayList(this.tracks.BATTLE, 2.0, true);
			break;

		case this.states.VICTORY:
			this.startPlayList(this.tracks.VICTORY, 2.0, true);
			break;

		case this.states.DEFEAT:
			this.startPlayList(this.tracks.DEFEAT, 2.0, true);
			break;

		default:
			warn(sprintf("%(functionName)s: Unknown music state: %(state)s", { functionName: "Music.updateState()", state: this.currentState }));
			break;
		}
	}
};

Music.prototype.storeTracks = function(civMusic)
{
	this.resetTracks();
	for each (var music in civMusic)
	{
		var type = undefined;
		for (var i in this.MUSIC)
		{
			if (music.Type == this.MUSIC[i])
			{
				type = i;
				break;
			}
		}

		if (type === undefined)
		{
			warn(sprintf("%(functionName)s: Unrecognized music type: %(musicType)s", { functionName: "Music.storeTracks()", musicType: music.Type }));
			continue;
		}

		this.tracks[type].push(music.File);
	}
};

Music.prototype.getRandomTrack = function(tracks)
{
	return tracks[getRandom(0, tracks.length-1)];
};

Music.prototype.startPlayList = function(tracks, fadeInPeriod, isLooping)
{
	Engine.ClearPlaylist();
	for (var i in tracks)
	{
		Engine.AddPlaylistItem( this.RELATIVE_MUSIC_PATH + tracks[i] );
	}

	Engine.StartPlaylist(isLooping);
};

Music.prototype.switchMusic = function(track, fadeInPeriod, isLooping)
{
  Engine.ClearPlaylist();
	Engine.AddPlaylistItem( this.RELATIVE_MUSIC_PATH + track );
	Engine.StartPlaylist(isLooping);
};

Music.prototype.isPlaying = function()
{
	return Engine.MusicPlaying();
};

Music.prototype.start = function()
{
	Engine.StartMusic();
	this.setState(this.states.PEACE);
};

Music.prototype.stop = function()
{
	this.setState(this.states.OFF);
};

