var playerPopout;

var winLoc = window.location.toString();
if (winLoc.match(/flash9/i)) {
  soundManager.flashVersion = 9;
  if (winLoc.match(/highperformance/i)) {
	soundManager.useHighPerformance = false;
	soundManager.useFastPolling = true;
  }
} else if (winLoc.match(/flash8/i)) {
  soundManager.flashVersion = 8;
}

soundManager.url = '/swf';
soundManager.useFlashBlock = false; // optionally, enable when you're ready to dive in
soundManager.debugMode = false;
soundManager.debugFlash = false;
soundManager.consoleOnly = false;
soundManager.bufferTime = 2;
// enable HTML5 audio support, if you're feeling adventurous. iPad/iPhone will always get this.
if (jQuery.browser.safari)
{
	soundManager.useHTML5Audio = false;
} else {
	soundManager.useHTML5Audio = true;
}

var Playlist = {
	playlistHeight: 0,
	isOpen: false,
	sound: undefined,
	soundHashId: undefined,
	playlistSong: {},
	init: function()
	{
		this.playlistHeight = $('#playlist_wrapper').height();
		
		this.togglePlaylist('hide');
		
		this.update();
		
		soundManager.onready(function() {
			if ($('#playlist_songs .playlist-song').length > 0)
			{
				$('#playlist_screen_info').removeClass('hidden');
			} else {
				$('#playlist_screen_empty').removeClass('hidden');
			}
			
			$('.playlist-song-info').live('click', function(e)
			{
				Playlist.playlistSong = $(this).closest('.playlist-song');
				
				$('.playlist-song').removeClass('hover');
				Playlist.playlistSong.addClass('hover');
				
				$('#playlist_screen .title').text(Playlist.playlistSong.find('.playlist-song-name:first').text());
				$('#playlist_screen .artist').text(Playlist.playlistSong.find('.playlist-song-artist:first').text());
				
				if (Playlist.playlistSong.find('.song-download:first').length == 0)
				{
					$('#playlist_song_download').hide();
				} else {
					$('#playlist_song_download').show();
				}
				
				var nextId = Playlist.playlistSong.attr('identifier');
				var artistId = $('#playlist').attr('artistIdentifier');
				var autoPlay = Playlist.sound != undefined;
				
				Playlist.soundHashId = 'playlist_song_'+nextId;
				
				$('#playlist').attr('currentSong', nextId);
				
				$('#playlist_popout').live('click', function()
				{
					var playlistId = $('#playlist').attr('identifier');

					playerPopout = window.open("http://" + window.location.host + "/playlist/player/id/" + playlistId + "/m/1" + "/user_id/" + artistId, "playlist", "location=0,status=0,scrollbars=0,resizeable=0,width=655,height=150");
				});
				
				if (soundManager.getSoundById(Playlist.soundHashId) == undefined)
				{
					soundManager.stopAll();
					
					Playlist.sound = soundManager.createSound({
						id:Playlist.soundHashId,
						url:Playlist.playlistSong.attr('mixdown'),
						onload: function() {
						},
						onplay: function() {
							Playlist.setState('pause');
						},
						onpause: function() {
							Playlist.setState('play');
						},
						onstop: function() {
							Playlist.setState('play');
						},
						onresume: function() {
							Playlist.setState('pause');
						},
						onfinish: function() {
							Playlist.sound.destruct();
							$('#playlist_seek_right').click();
						},
						whileplaying: function() {
							Playlist.calc();

							if (this.updatedListens == undefined 
								&& this.position > (1000 * 10))
							{
								this.updatedListens = true;

								$.post('/single-play/update-num-listens', {id:nextId, pro:Playlist.playlistSong.attr('pro')}, function(response)
								{
									if (! isNaN(response))
									{
										$('.listens-'+nextId).text(response);
									}
								});
								
								$.post('/playlist/add-listen', {id:$('#playlist').attr('identifier')}, function(response)
								{
									if (! isNaN(response))
									{
										$('.playlist-listens-'+$('#playlist').attr('identifier')).text(response);
									}
								});
							}
						},
						autoPlay: autoPlay
					});
				} else {
					Playlist.sound = soundManager.getSoundById(Playlist.soundHashId);
					$('#playlist_play').click();
				}
				
				$('#playlist_trackbar_remaining, #playlist_trackbar_played').click(function(e)
				{
					var relativeX = e.pageX - $(this).offset().left;
					
					var max = $('#playlist_trackbar_remaining').width();
					var pos = ((Playlist.sound.position / Playlist.sound.durationEstimate) * 100) * (max / 100);
					var seek = (relativeX / max) * Playlist.sound.durationEstimate;
					
					soundManager.setPosition(Playlist.soundHashId, seek);
				});
			});
			
			$('.playlist-song-info:first').click();
			
			$('#playlist_seek_left').live('click', function()
			{
				soundManager.pauseAll();
				Playlist.playlistSong.prev().find('.playlist-song-info:first').click();
			});
			
			$('#playlist_seek_right').live('click', function()
			{
				soundManager.pauseAll();
				Playlist.playlistSong.next().find('.playlist-song-info:first').click();
			});
			
			$('#playlist_play').live('click', function()
			{
				if (Playlist.sound.playState == 0 || Playlist.sound.paused)
				{
					soundManager.pauseAll();
					Playlist.sound.play();
				} else {
					Playlist.sound.pause();
				}
			});
			
			$('.playlist-song-delete').live('click', function()
			{
				var c = $(this);
				var ps = $(this).closest('.playlist-song');

				if (ps.attr('identifier') > 0 && confirm('Remove this song from your playlist?'))
				{
					$.post('/playlist/remove-song', {id:c.attr('rel')}, function(response)
					{
						if (response == BB.response.prompt_login)
						{
							BbPopUp.promptLogin();
						} else {
							soundManager.destroySound('playlist_song_' + ps.attr('identifier'));
							
							ps.remove();
							Playlist.update();
						}
					});
				}
			});
		});
		
		soundManager.ontimeout(function() {
			alert('Sound manager error occured!');
		});
	},
	add: function(songId, type)
	{
		if (songId > 0)
		{
			if ($.post('/user/session', null, function(response)
			{
				if (response == BB.response.prompt_login)
				{
					BbPopUp.promptLogin();
					return;
				} 
				else 
				{
					$.post('/playlist/add', {song_id:songId, type:type}, function(response)
					{
						if (response == BB.response.prompt_login)
						{
							BbPopUp.promptLogin();
						} else if (response == 2) {
							//
						} else {
							alert('Song added!');
						}
					});
				}
			}));
		}
	},
	setState: function(state)
	{
		switch (state)
		{
			case 'play' :
				$('#playlist_play').removeClass('pause');
			break;
			
			case 'pause' :
				$('#playlist_play').addClass('pause');
				break;
		}
	},
	calc: function()
	{
		var max = $('#playlist_trackbar_remaining').width();
		var pos = ((Playlist.sound.position / Playlist.sound.durationEstimate) * 100) * (max / 100);

		$('#playlist .trackbar-playhead').css({marginLeft:pos+"px"});
		$('#playlist_trackbar_played').css({width:pos+"px"});
		
		var remaining = Playlist.sound.durationEstimate - Playlist.sound.position;
		var date = new Date(remaining);
		var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
		
		$('#playlist_trackbar_time').text("-" + date.getMinutes() + ":" + seconds);
	},
	update: function()
	{
		$('input.playlist-position').each(function(i)
		{
			$(this).val(i + 1);
		});
		
		if ($('.playlist-song').length == 0)
		{
			this.togglePlaylist('hide');
		}
	},
	togglePlaylist: function(state)
	{
		if (state == 'show' && $('.playlist-song').length > 0 && ! Playlist.isOpen)
		{
			$('#playlist_wrapper').animate({height: ($('#playlist_wrapper').height() + $('#playlist_tray').height()) + 25}, null, function()
			{
				Playlist.isOpen = true;
			});
			$('#playlist_tray').css({marginTop: 0});

			if (window.name == 'playlist')
			{
				var width = document.getElementById("playlist").offsetWidth;
				var height = document.getElementById("playlist_tray").offsetHeight;
				window.resizeTo(width, height + 103);
			}
		} else {
			$('#playlist_wrapper').animate({height: this.playlistHeight}, null, function()
			{
				if (Playlist.isOpen && window.name == 'playlist')
				{
					var width = document.getElementById("playlist").offsetWidth;
					var height = document.getElementById("playlist_tray").offsetHeight;
					window.resizeTo(width, height);
				}
				
				$('#playlist_tray').css({marginTop: "-" + ($('#playlist_tray').height() + 150) + "px"});
				Playlist.isOpen = false;
			});
		}
	}
};

var SimplePlayer = {
	sound: undefined,
	play: function(e, hash, url, type)
	{
		var songId = 0;
	
		if (is_int(hash))
		{
			songId = hash;
		}

		var id = 'simple_player_' + hash;

		if (soundManager.getSoundById(id) == undefined)
		{
			if (url.indexOf('http://') == -1)
			{
				url = 'http://' + window.location.hostname + url;
			}
			
			SimplePlayer.sound = soundManager.createSound({
				id:id,
				url:url,
				onload: function() {
					//
				},
				onplay: function() {
					$(e).closest('.song-play').addClass('pause');
				},
				onresume: function() {
					$(e).closest('.song-play').addClass('pause');
				},
				onpause: function() {
					$(e).closest('.song-play').removeClass('pause');
				},
				onstop: function() {
					$(e).closest('.song-play').removeClass('pause');
				},
				onfinish: function() {
					SimplePlayer.sound.destruct();
					$(e).closest('.song-play').removeClass('pause');
				},
				whileplaying: function() {
					if (songId > 0)
					{
						if (this.updatedListens == undefined 
								&& this.position > (1000 * 10))
						{
							this.updatedListens = true;
							
							$.post('/single-play/update-num-listens', {id:songId, type:type}, function(response)
							{
								$('.listens-'+songId).text(response);
							});
						}
					}
				},
				autoPlay: false
			});
		} else {
			this.sound = soundManager.getSoundById(id);
		}
		
		if (this.sound.playState == 0 || this.sound.paused)
		{
			soundManager.pauseAll();
			this.sound.play();
		} else {
			this.sound.pause();
		}
	}
};

var Player = {
	sound: undefined,
	play: function(e, songId, url, type)
	{
		var id = 'player_' + songId;

		var player =  $(e).closest('.player');

		if (soundManager.getSoundById(id) == undefined)
		{
			this.sound = soundManager.createSound({
				id:id,
				url:url,
				onload: function() {
					//
				},
				onplay: function() {
					$(e).closest('.player-play').addClass('pause');
				},
				onresume: function() {
					$(e).closest('.player-play').addClass('pause');
				},
				onpause: function() {
					$(e).closest('.player-play').removeClass('pause');
				},
				onstop: function() {
					$(e).closest('.player-play').removeClass('pause');
				},
				onfinish: function() {
					Player.sound.destruct();
					$(e).closest('.player-play').removeClass('pause');
				},
				whileplaying: function() {
					var max = player.find('.player-trackbar-remaining:first').width();
					var pos = ((Player.sound.position / Player.sound.durationEstimate) * 100) * (max / 100);

					player.find('.trackbar-playhead:first').css({marginLeft:pos+"px"});
					player.find('.player-trackbar-played:first').css({width:pos+"px"});

					if (this.updatedListens == undefined 
						&& this.position > (1000 * 10))
					{
						this.updatedListens = true;

						$.post('/single-play/update-num-listens', {id:songId, type:type}, function(response)
						{
							$('.listens-'+songId).text(response);
						});
					}
					
					if ($('#song_profile').length == 1)
					{
						var remaining = Player.sound.durationEstimate - Player.sound.position;
						var date = new Date(remaining);
						var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
						
						$('#song_profile #playlist_trackbar_time').text("-" + date.getMinutes() + ":" + seconds);
					}
				},
				autoPlay: false
			});
		} else {
			this.sound = soundManager.getSoundById(id);
		}
		
		player.find('.player-trackbar-remaining:first, .player-trackbar-played:first').click(function(e)
		{
			var relativeX = e.pageX - $(this).offset().left;
			
			var max = player.find('.player-trackbar-remaining:first').width();
			var pos = ((Player.sound.position / Player.sound.durationEstimate) * 100) * (max / 100);
			var seek = (relativeX / max) * Player.sound.durationEstimate;
			
			soundManager.setPosition(id, seek);
		});

		if (this.sound.playState == 0 || this.sound.paused)
		{
			soundManager.pauseAll();
			this.sound.play();
		} else {
			this.sound.pause();
		}
	}
};

