var audioInterfaces = [];

function createProgressChangeHandler(track) {
	function handler(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime)
	{
		if (playedTime == 0) return;
		var playedSeconds = Math.round(playedTime/1000);
		var playedMinutes = Math.floor(playedSeconds/60);
		playedSeconds = Math.round(playedSeconds%60);
		if (playedSeconds >= 10) {
			playedSecondsText = "" + playedSeconds;
		} else {
			playedSecondsText = "0" + playedSeconds;
		}
		var playedTimeText = "" + playedMinutes + ":" + playedSecondsText;
		track.find(".time").text(playedTimeText);
		track.find(".play, .pause").css("left", "" + playedPercentAbsolute + "%");
	}
	return handler;
}

function createSoundCompleteHandler(track) {
	function handler() {
		track.find(".player").removeClass("playing");
		track.find(".play, .pause").css("left", "0");
		track.find(".play-bar").css("width", "0");
		track.find(".time").text("");
	}
	return handler;
}

function createPlayHandler(track) {
	function handler(event) {
		event.preventDefault();
		
		for (var i=0, audioInterface; audioInterface = audioInterfaces[i]; ++i) {
			if (track.find(".audio-interface")[0] == audioInterface[0]) continue;
			try{
				audioInterface.stop();
			} catch(err) {
				// console.log("Could not stop an audio-interface. This is not a serious error");
			}
			var player = audioInterface.parent(".player");
			player.removeClass("playing");
			player.find(".play, .pause").css("left", "0");
			player.find(".play-bar").css("width", "0");
			player.find(".time").text("");
		}
		
		track.find(".player").removeClass("paused");
		track.find(".player").addClass("playing");
		
		return false;
	}
	return handler;
}

function createPauseHandler(track) {
	function handler(event) {
		event.preventDefault();
		track.find(".audio-interface").stop();
		track.find(".player").removeClass("playing");
		track.find(".player").addClass("paused");
		
		return false;
	}
	return handler;
}

function createReadyHandler(track, url) {
	function handler() {
		$(this).setFile(url);
	}
	return handler;
}

function bindAudioPlayers() {
	$(".tracks > li").each(function() {
		var track = $(this);

		var download = track.find("a.download");
		if (download.length == 0) return;
		var downloadURL = download.attr("href");

		var idPrefix = track.attr("id") + "-";
		var player = $("\
			<div class='player'>\
				<div id='" + idPrefix + "audio-interface' class='audio-interface'></div>\
				<div class='time'></div>\
				<div class='progress'>\
					<div class='buffer-bar' id='" + idPrefix + "buffer-bar'>\
						<div class='play-bar' id='" + idPrefix + "play-bar'></div>\
					</div>\
				</div>\
				<ul class='controls'>\
					<li class='play' id='" + idPrefix + "play'>play</li>\
					<li class='pause' id='" + idPrefix + "pause'>pause</li>\
				</ul>\
			</div>");
		track.find("a.download").replaceWith(player);
	
		var audioInterface = player.find(".audio-interface");
		audioInterfaces.push(audioInterface);
		audioInterface.jPlayer({
			"swfPath": swfPath,
			"ready": createReadyHandler(track, downloadURL)
		});
		
		audioInterface
			.jPlayerId("play", idPrefix + "play")
			.jPlayerId("pause", idPrefix + "pause")
			.jPlayerId("loadBar", idPrefix + "buffer-bar")
			.jPlayerId("playBar", idPrefix + "play-bar")
			.onProgressChange(createProgressChangeHandler(track))
			.onSoundComplete(createSoundCompleteHandler(track));
			track.find(".play").click(createPlayHandler(track));
			track.find(".pause").click(createPauseHandler(track));
	});
}

$(document).ready(bindAudioPlayers);