// Preload pause button image.
(function() {
	pauseImg = new Image(60,60);
	pauseImg.src = '../images/pause.png';
})();

var player, flashMusicPlayer, useFlashPlayer = false;

try {
	if (Audio === undefined) {
		Audio = null
	}
} catch (e) {
	var Audio;
}

if (!Audio || document.createElement('audio').play === undefined) {
	useFlashPlayer = true;
}

if (useFlashPlayer) {
	function playerReady(obj) {
		flashMusicPlayer = document.getElementById(obj['id']);
		addListeners();
	}

	function addListeners() {
		if (flashMusicPlayer) {
			flashMusicPlayer.addModelListener("TIME", "timeListener");
			flashMusicPlayer.addControllerListener("STOP", "stopListener");
		}
		else { setTimeout(addListeners, 100); }
	}

	function timeListener(obj) { player.currentTime = obj.position; }
	function stopListener(obj) { player.stop(); }
}

jQuery(function($) {
	var songLength, seekerUpdater,
	    seekbar = $('#seekbar'),
	    seeker = $('#seeker'),
		playPause = $('#play-pause');

	function updatePlayPause()
	{
		if (player && player.paused) {
			playPause.addClass('paused').removeClass('playing');
		} else {
			playPause.removeClass('paused').addClass('playing');
		}
	}

	function updateSeekbar()
	{
		if (!dragging && player && !player.paused) {
			var percent = (player.currentTime / songLength),
				position = Math.floor(percent * seekbar.width())

			seeker.css('left', position);
		}
	}

	$('#play-pause').click(function() {
		if (player) {
			if (player.paused) {
				player.play();
			} else {
				player.pause();
			}

			updatePlayPause();
		}
	});

	var dragging = false;

	$('#seeker').mousedown(function(e) {
		if (player) {
			dragging = true;
			startUpdatingSeekbar();
		}
	});

	$('body').mouseup(function(e) {
		if (player) {
			dragging = false;
		}
	}).mousemove(function(e) {
		if (dragging && player) {
			var x = e.pageX - $('#seekbar').offset().left;
			if (x > 0 && x < $('#seekbar').width()) {
				$('#seeker').css('left', x + 'px');
			}
			player.currentTime = (x / seekbar.width()) * songLength;
			if (player.flashBackend) {
				player.seek();
			}
			return false;
		}
	});

	function secondsFromTime(string) {
		var parts, minutes, seconds;

		parts = string.split(':');
		minutes = Number(parts[0]);
		seconds = Number(parts[1]);
		return (minutes * 60) + seconds
	}

	function timeFromSeconds(seconds) {
		return Math.floor(seconds / 60) + ':' + Number(seconds % 60)
	}

	function startUpdatingSeekbar() {
		seekerUpdater = setInterval(updateSeekbar, Math.floor((songLength * 1000) / seekbar.width()));
	}

	function stopUpdatingSeekbar() {
		clearInterval(seekerUpdater);
	}

	var musicPlayerElementId = 'music-player-element';

	function playSong(title, duration, formats) {
		var file, base = window.location.href;

		if (base[base.length-1] !== '/') {
			base += '/';
		}

		if (player && player.pause) {
			player.pause();
		}

		formats.sort().reverse(); // prefer ogg to mp3. FIXME: rather opaque

		if (!useFlashPlayer) {
			$('#'+musicPlayerElementId).remove();
			player = document.createElement('audio');
			player.id = musicPlayerElementId;
			player.autobuffer = 'autobuffer';
			sources = [];

			$.each(formats, function() {
				var source = document.createElement('source');
				source.src = base + title + '.' + this;
				$(player).append(source);
			});

			$('body').append(player);

		} else {
			file = base + title + '.mp3';
			player = new Audio(file);
		}

		seeker.css('left', 0);
		songLength = secondsFromTime(duration);

		$(player)
			.bind('play', updatePlayPause)
			.bind('pause', updatePlayPause)
			;

		startPlaying = function() {
			player.play();
			startUpdatingSeekbar();
			updatePlayPause();
		};

		if (player) {
			startPlaying();
		} else {
			setTimeout(startPlaying, 100);
		}
	}

	function getSongMeta(elm) {
		var $elm     = $(elm),
		    title    = $elm.find('.name').text(),
		    duration = $elm.find('.duration').text(),
			classes  = $elm.attr('class').split(' '),
			formats = [];

		$.each(classes, function() {
			if (this.match(/^format-/)) {
				formats.push(this.substring('format-'.length));
			}
		});

		return { title:title, duration:duration, formats:formats };
	}

	$('#playlist li').click(function() {
		meta = getSongMeta(this);
		playSong(meta.title, meta.duration, meta.formats);
	});

	if (useFlashPlayer) {
		$('#music-player').append('<div id="flash-player"></div>');

		var swf = new SWFObject('../flash/jwplayer.swf','player','0','0','9');
        swf.addParam('allowscriptaccess','always');
        swf.write('flash-player');

		Audio = function(file) {
			this.flashBackend = true; // don't change this!!
			this.currentTime = 0;
			this.paused = false;

			function send(cmd, param) {
				if (flashMusicPlayer) {
					flashMusicPlayer.sendEvent(cmd, param);
				} else {
					setTimeout(function() { send(cmd, param); }, 100);
				}
			}

			send('LOAD', file);

			this.play = function() {
				send('PLAY', 'true');
				this.paused = false;
			};

			this.pause = function() {
				send('PLAY', 'false');
				this.paused = true;
			};

			this.stop = function() {
				// TODO: Play the next item in the playlist.
			}

			this.seek = function() {
				send('SEEK', this.currentTime);
			};
		};
	}

	if (document.location.hash) {
		title = decodeURIComponent(document.location.hash.substring(1));

		elm = $('#playlist li:contains("'+title+'")').filter(function() {
			return $(this).find('.name').text() == title;
		})[0];

		meta = getSongMeta(elm);
		playSong(meta.title, meta.duration, meta.formats);
	}
});
