//--------------------------------------------			
// Wrapper functions for soundManager2
// By Simon Aurell 2007-01-29
//--------------------------------------------

// Internal configuration
// Change these if you *have* to use these IDs for something else...
//-------
var trackPrefix = "track_";				// ID prefix of track links, needs to match
var toggleButtonID = "playerToggle"; 	// ID of play/pause button link, needs to match
var prevButtonID = "playerPrev";		// Same for "previous" button...
var nextButtonID = "playerNext";		// ...and "next"
var artworkID = "playerArtwork";		// ...and artwork image
var toggleLabelID = "playerToggleLabel"; // The label that displays the "Play" and "Stop" text
var playerPrefix = "audio_";			// ID prefix for referencing songs (internal)

var toggleStopLabel = "Stop";
var togglePlayLabel = "Play";


//--------------------------------------------
// Event handlers
//--------------------------------------------

// Triggered when soundManager is ready
soundManager.onload = function() {

	// Load songs
	for (var i = 0; i < playlist.length; i++) {
		soundManager.createSound( getPlayerID(i), playlist[i] );
	}
	
	// Add onclick handlers
	generateHandlers();
	
	// Autoplay?
	if(autoPlay) {
		playSong(currentTrack);
	}

}

soundManager.onerror = function() {
	//alert('Audio player failed to load');
}

function loadFinished(id)
{
	track = id.substr(playerPrefix.length, id.length);
	setClass(trackPrefix + track, "stop");	
}

function loadProgress(id)
{
	track = id.substr(playerPrefix.length, id.length);
	setClass(trackPrefix + track, "loading");
}

function songFinished()
{
	if(currentTrack < (playlist.length - 1)) {
		nextSong();
	}
	else {
		if(loopPlaylist) {
			playSong(0);
		}
		else {
			setClass(trackPrefix + currentTrack, "play");
			setClass(toggleButtonID, "play");
		}
	}

}

//--------------------------------------------
// Wrapper API
//--------------------------------------------


// Plays this track. If this track is already playing, stops it.
// If another track is playing, stops that track and plays this track.
function playSong(track)
{
	if(track != currentTrack) {	
		// Stop current track
		soundManager.stop(getPlayerID(currentTrack));
		setClass(getTrackID(currentTrack), "play");
		
		// Play new track
		soundManager.play(getPlayerID(track));
		setClass(getTrackID(track), "stop");
		if(useControls) {
			setClass(toggleButtonID, "stop");
			if(changeToggleLabel) {
				document.getElementById(toggleLabelID).innerHTML = toggleStopLabel;
			}
		}
	}
	else {
		// Toggle current track
		soundManager.togglePause(getPlayerID(track));
		toggleClass(getTrackID(track));
		if(useControls) {
			toggleClass(toggleButtonID);
		}					
	}
	currentTrack = track;	
}

function togglePlay()
{
	playSong(currentTrack);
}

function stop()
{
	soundManager.stop(getPlayerID(currentTrack));
}

function changeArtwork(track)
{
	if(useArtwork) {
		document.getElementById(artworkID).src = artwork[track];
	}
}

// Plays next song
// TBD: behaviour when not playing?
function nextSong()
{
	// Only skip if there is a next track
	if(currentTrack < (playlist.length - 1)) {
		soundManager.stop(getPlayerID(currentTrack));
		playSong(currentTrack + 1);
	}
	else if(loopPlaylist) {
		soundManager.stop(getPlayerID(currentTrack));
		playSong(0);
	}
}

// Plays previous song
// TBD: behaviour when not playing?
function prevSong()
{
	// Only skip if there is a next track
	if(currentTrack > 0) {
		soundManager.stop(getPlayerID(currentTrack));
		playSong(currentTrack - 1);
	}
	else if(loopPlaylist) {
		soundManager.stop(getPlayerID(currentTrack));
		playSong(playlist.length - 1);
	}	
}

//--------------------------------------------			
// Helper functions
//--------------------------------------------			

// Generates the onclick handler for elements with IDs like track_0, track_1
// (Depending on trackPrefix, in this case "track_")
function generateHandlers()
{
	for(var i = 0; i < playlist.length; i++) {
		// Find track container and enable it
		id = trackPrefix + i;
		var element = document.getElementById(id);
		setClass(id, "enabledTrack");
		
		// Add link and event handler
		oldTitle = element.innerHTML;
		element.innerHTML = "<a href=\"#\">" + oldTitle + "</a>";
		//element.innerHTML = "<a href=\"javascript:playSong(" + i + ")\">" + oldTitle + "</a>";
		var playLink = element.firstChild;
		eval("playLink.onclick = function() { playSong(" + i + "); return false; }");
	}
	if(useControls) {
		addHandler(prevButtonID, "prevSong");
		addHandler(toggleButtonID, "togglePlay");
		addHandler(nextButtonID, "nextSong");
	}
}

function addHandler(id, functionName)
{
	button = document.getElementById(id)
	oldTitle = button.innerHTML;
	button.innerHTML = "<a href=\"#player\">" + oldTitle + "</a>";
	link = button.firstChild;
	eval("link.onclick = function() { " + functionName + "(); }");
	setClass(id, "enabled");
}

function toggleClass(id)
{
	element = document.getElementById(id);
	if("stop" == element.getAttribute("class") || "stop" == element.getAttribute("className") ) {
		newClass = "play";
		if(changeToggleLabel) {
			document.getElementById(toggleLabelID).innerHTML = togglePlayLabel;
		}		
	}
	else {
		newClass = "stop";
		if(changeToggleLabel) {
			document.getElementById(toggleLabelID).innerHTML = toggleStopLabel;
		}		
	}
	element.setAttribute("class", newClass);
	element.setAttribute("className", newClass);				
}

function setClass(id, newClass)
{
	element = document.getElementById(id);
	element.setAttribute("class", newClass);
	element.setAttribute("className", newClass);				
}

function getPlayerID(track)
{
	return playerPrefix + track;
}
function getTrackID(track)
{
	return trackPrefix + track;
}