
$(document).bind('ready', function(){

	// Development
	//if( $('body').is('.user-mattlowden') )
	if( false )
	{
		$('.track-list tr td.track-play a').css('display', 'block');
		$('a[rel~=playlist][rel~=play]').bind('click', function(){
			var playlist_id = $(this).attr('playlist-id');
			window.location = 'spotify:app:sharemyplaylists:playlist:id:'+playlist_id+':track:1';
			return false;
		});
	}
	else
	{
		// Process playlist play
		$('a[rel~=playlist][rel~=play]')
			.bind('click', function(){
				var playlist_id = $(this).attr('playlist-id');
				$.ajax({
					type: "GET",
					dataType: "json",
					url: "/api/rest",
					data: {
						'method': 'smp.playlists.play',
						'id': playlist_id
					},
					async : false
				});
			})
			.bind('click', function(){
				var playlist_id = $(this).attr('playlist-id');
				$.ajax({
					type: "GET",
					dataType: "json",
					url: "/api/rest",
					data: {
						'method': 'smp.user.facebook_playlist_play',
						'playlist_id': playlist_id
					},
					async : false
				});
			});
	}

	// Playlist Description "Read More"
	$('a.playlist-read-more').bind('click', function(){
		var parent = $(this).closest('div.block-content');
		$('p.playlist-description', parent).hide();
		$('p.playlist-description-full', parent).show();
		return false;
	});

	// Playlist Description "Read Less"
	$('a.playlist-read-less').bind('click', function(){
		var parent = $(this).closest('div.block-content');
		$('p.playlist-description', parent).show();
		$('p.playlist-description-full', parent).hide();
		return false;
	});

	// Header "Sign in"
	$('div.button-header-signin a').bind('click', function(){
		$('div#userbar').slideToggle(500);
		$(this).toggleClass('selected');
		return false;
	});

	// Playlist Generator "Add Your Plalyist in Spotify" button
	$('div.add-your-playlist-spotify a').bind('click', function(){
		
		var track_uris = new Array();
		$('#playlist-generator input').each(function(){
			track_uris.push( $(this).val() );
		});

		$.ajax({
			type: "GET",
			dataType: "json",
			url: "/api/rest",
			data: {
				'method': 'smp.playlistgenerator.save',
				'track_spotify_uris': track_uris,
				'based_on': $('em.based-on').text(),
			},
			async : false,
			success: function(data){
				if( data.status == 'ok' )
				{
					window.location = 'spotify:app:sharemyplaylists:generator:playlist:'+data.playlistgenerator_playlist.id;
				}
			}
		});

		return false;
	});

	// Header login form
	$('#userbar form').bind('submit', function(){
		var form = $(this);
		var email = $('#login_username', form).val();
		var password = $('#login_password', form).val();

		$.ajax({
			type: "GET",
			dataType: "json",
			url: "/api/rest",
			data: {
				'method': 'smp.user.authorise',
				'email': email,
				'password': password,
				'cookie': 1
			},
			async : false,
			success: function(data){
				$('p.error', form).remove();
				if( data.status == 'ok' )
				{
					window.location = window.location;
				}
				else
				{
					form.append('<p class="error">'+data.message+'</p>');
				}
			}
		});

		return false;
	});

	// Playlist Generator: Add Artist
	$('form.playlist-generator div.field-artist_name p a').bind('click', function(){
		var artist_name_input_clone = $('<input type="text" value="" id="artist_name" name="artist_name[]" class="data input-text" />');
		artist_name_input_clone = $('input.input-text:last', $(this).closest('div.form-field')).after(artist_name_input_clone).next();
		artist_name_input_clone.val('').fadeIn(500);
		return false;
	});
	
	$('form.playlist-generator').append('<a title="SMP Playlist Generator Powered by The Echo Nest" target="_blank" href="http://the.echonest.com"><img src="/images/partners/logos/echo_nest_logo.png"></a>');

	// Vertical Scroller
	$('div.vertical-scroller').each(function(){
		var o = $(this);
		var v = {
			scroll_increment: 250,
			inner: o.find('ul'),
			inner_height: o.find('ul').outerHeight(true),
			container_height: o.find('div.block-content').innerHeight(),
			max_top: 0,
			active: false
		};
		
		v.max_top = v.container_height - v.inner_height;

		o.find('a.up')
			.bind('click', function(){
				if( v.active )
				{
					return false;
				}

				var top = parseInt(v.inner.css('top'));
				var new_top = top + v.scroll_increment;
				var	new_top = new_top > 0 ? 0 : new_top;

				v.active = true;

				v.inner.animate(
					{ top: new_top },
					500,
					function(){
						v.active = false;
					}
				);

				return false;
			});

		o.find('a.down')
			.bind('click', function(){
				if( v.active )
				{
					return false;
				}

				var top = parseInt(v.inner.css('top'));
				var new_top = top - v.scroll_increment;
				var	new_top = v.max_top > new_top ? v.max_top : new_top;

				v.active = true;

				v.inner.animate(
					{ top: new_top },
					500,
					function(){
						v.active = false;
					}
				);

				return false;
			});
	});

	// text prompts
	$('input[type=text]').each(function(){
		var target = $(this);
		if(title = target.attr('title')){
			if(target.val().length === 0){
				target.val(target.attr('title'));
			}
			
			target.bind('blur', function(){
				if(target.val().length === 0){
					target.val(target.attr('title'));
				}
			});

			target.bind('focus', function(){
				if(target.val() === target.attr('title')){
					target.val('');
				}
			});
		}
	});

	$('#generator_link').bind('mouseenter', function(){
		var text = $(this).select().val();
	});

	$('div.block-playlist-generator').playlistGenerator();

	// Expand / collapse artist bio
	$('p.artist-bio-full a, p.artist-bio-summary a').live('click', function(){
		if( $(this).parent().is('p.artist-bio-summary') )
		{
			$('p.artist-bio-summary').css('display', 'none');
			$('p.artist-bio-full').css('display', 'block');
		}
		else
		{
			$('p.artist-bio-summary').css('display', 'block');
			$('p.artist-bio-full').css('display', 'none');
		}
		return false;
	});
	
	// Flash image uploads
	$('.input-file').each(function(){
		var o = $(this);
		
		o.wrap('<div class="input">').uploadify({
			'uploader'  : '/tpl/swf/jquery.uploadify.swf',
			'script'    : '/tpl/php/jquery.uploadify.php',
			'expressInstall' : '/tpl/swf/expressInstall.swf',
			'folder'    : '/uploads',
			'buttonImg' : '/tpl/img/jquery.uploadify.gif',
			'cancelImg' : '/tpl/img/jquery.uploadify.gif',
			'rollover'  : true,
			'auto'      : true,
			'multi'     : false,
			'fileExt'   : '*.jpg;*.jpeg;*.gif;*.png',
			'fileDesc'  : 'Image Files',
			'width'		: '60',
			'height'	: '30',
			onComplete	: function(event, ID, fileObj, response, data)
			{
				var container = o.parent()
					.css('display', 'none')
					.closest('.form-field');

				var path = fileObj.filePath;
					path = path.replace(/^\/|\/$/g, '');

				if( container.find('.preview-image').length > 0 )
				{
					container
						.find('img.preview-image')
							.attr('src', 'thumb.php?m=stretch&h=100&w=100&f='+path);
				}
				else
				{
					container
						.find('label')
						.after('<img class="preview-image" src="thumb.php?m=stretch&h=100&w=100&f='+path+'" />');
				}

				o
					.parent()
					.after('<input type="hidden" name="'+o.attr('name')+'" value="'+path+'" />');
				o.remove();
			},
			onSelect	: function(){
				if( o.is('#playlist_image') )
				{
					$('div.field-playlist_createartwork').css('display', 'none');
				}
			}
		});
	});

	// Generate artwork for palylist image
	$('input[name="playlist_createartwork"]').live('click', function(){
		$('div.field-playlist_createartwork').fadeOut(500);
		$(this).closest('form').find('div.field-playlist_image div.input').fadeOut(500, function(){
			$(this).after('<p class="confirm-artwork">Artwork will be generated after submitting your playlist</p>');
		});
		$('input[name="playlist_createartwork_check"]').attr('checked', 'checked');
		return false;
	});

	// Auto-insert the Spotify playlist title
	$('input#spotify_url').bind('change', function(){
		/*$.ajax({
			type: "POST",
			dataType: "json",
			url: "/api/",
			data: {
				'method': 'spotify_api',
				'function': 'get_playlist',
				'playlist_url' : $(this).val()
			},
			async : false,
			success: function(data){
				if( data.status == 'ok' && data.content.title && data.content.title.length > 0 && $('form.submit-playlist input#playlist_title').val().length == 0 )
				{
					$('form.submit-playlist input#playlist_title').val(data.content.title);
				}
			}
		});*/
	});

	// Process newly submitted playlist
	$('input[rel~=playlist][rel~=process]').each(function(){
		var playlist_id = $(this).val();
		$.ajax({
			type: "GET",
			dataType: "json",
			url: "/api/rest",
			data: {
				'method': 'smp.playlists.process',
				'id': playlist_id
			},
			async : false,
			success: function(data){
				if( data.status == 'ok' )
				{
					window.location = 'submit-your-playlist/completed/playlist/'+data.playlist.id;
				}
			}
		});
	});

	// Check for user notifications
	$.checkUpdates();
	$('div.button-header-notifications a:first')
		.bind('mouseenter', function(){
			var target = $(this);
			$.ajax({
				type: "GET",
				dataType: "json",
				url: "/api/rest",
				data: {
					'method': 'smp.user.notifications.setAsRead'
				},
				async : false,
				success: function(data){
					target.find('span.count').remove();
				}
			});
		});

	// Initiate search bar
	$('div.searchbar-top').searchBar();

	// Initiate promoted content
	$('div.promoted').promotedContent();

	// Disable text selection
	$('table.lyric-track-list, p.track-lyrics').disableSelection();

	// Modal dialogue
	var modal_login_template = {
		title: 'Sign In or Register',
		content: '<p>Sign into ShareMyPlaylists.com using your Twitter or Facebook account.</p><p class="facebook"><a href="login/facebook?referrer=playlist_action&registration_type=facebook" class="connect">Sign in with Facebook</a></p><p class="twitter"><a href="login/twitter?referrer=playlist_action&registration_type=twitter" class="connect">Sign in with Twitter</a></p><p>Alternatively, <a rel="user login_smp" href="">login</a> or <a href="register?referrer=playlist_action&registration_type=normal">register</a> with ShareMyPlaylists.com.</p>',
		classname: 'login-to-rate'
	};
		
	$('a[rel*=forgotten-password]').bind('click', function(){
		var form_html = '<p>Enter your email address below and we\'ll reset your password.</p><form action="/" class="standard clear-fix" method="post" enctype="multipart/form-data">';
		form_html += '<div class="clear-fix form-field field-forgot_email form-field-text">';
		form_html += '<label for="forgot_email" class="input-text">Email</label>';
		form_html += '<input type="text" value="" id="forgot_email" name="forgot_email" class="data input-text" title="Enter Email">';
		form_html += '</div>';
		form_html += '<div class="clear-fix form-field field-login_submit form-field-submit button">';
		form_html += '<input type="submit" value="Reset Password" name="reset_submit">';
		form_html += '</div>';
		form_html += '</form>';

		$(this).modalContent({
			title: 'Forgotten Password',
			content: form_html,
			classname: 'forgotten-password'
		});
		return false;
	});

	$('a[rel~=user][rel~=login_smp]').live('click', function(){
		var login_form = $('#userbar form:first')
			.clone()
			.addClass('standard clear-fix');

		$(this).modalContent({
			title: 'Sign In To ShareMyPlaylists.com',
			content: login_form.outerHTML(),
			classname: 'login'
		});
		return false;
	});
	
	$('a[rel~=user][rel~=login]').live('click', function(){
		$(this).modalContent(modal_login_template);
		return false;
	});

	$('a[rel~=playlist][rel~=delete]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$(this).modalContent({
			title: 'Delete this Playlist',
			content: '<p>Are you sure you want to delete this playlist? This can\'t be un-done.</p>'
				+'<div class="button"><div class="button-left"><div class="button-right"><a href="'+$(this).attr('href')+'">Yes</a></div></div></div>'
				+'<div class="button button-green"><div class="button-left"><div class="button-right"><a rel="close" href="'+$(this).attr('href')+'">No</a></div></div></div>',
			classname: 'delete-playlist'
		});
		
		return false;
		
	});

	// Text Editor
	$('div.field-content textarea').tinymce({
		// Location of TinyMCE script
		script_url : '/tpl/js/jquery.tinymce/tiny_mce.js',

		// General options
		theme : "advanced",
		height: "500",
		plugins : "filemanager,autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,advlist",

		// Theme options
		theme_advanced_buttons1 : "code,|,bold,italic,underline,strikethrough,|,formatselect,|,pastetext,|,bullist,numlist,|,outdent,indent,blockquote,link,unlink,image,|,removeformat,visualaid,|,sub,sup,|,charmap,filemanager,media,fullscreen",
		theme_advanced_buttons2	: "",
		theme_advanced_buttons3 : "",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_statusbar_location : "bottom",
		theme_advanced_resizing : true,

		// Example content CSS (should be your site CSS)
		//content_css : "css/content.css",

		// Drop lists for link/image/media/template dialogs
		template_external_list_url : "lists/template_list.js",
		external_link_list_url : "lists/link_list.js",
		external_image_list_url : "lists/image_list.js",
		media_external_list_url : "lists/media_list.js",
	});
});

$.checkUpdates = function()
{
	$.ajax({
		type: "GET",
		dataType: "json",
		url: "/api/rest",
		data: {
			'method': 'smp.user.getAlerts'
		},
		async : false,
		success: function(data){
			if(data.alerts && data.alerts.length > 0)
			{
				latest_alert = data.alerts.pop();
				$(this).modalContent({
					title: latest_alert.title,
					content: latest_alert.content,
					classname: latest_alert.classname ? latest_alert.classname : '',
					stacked: data.alerts
				});
			}
		}
	});
};

$.fn.modalContent = function(options){
	$(this).each(function(){

		var o = $(this);
		o.v = {
			modal_bg: $('#modal_bg'),
			modal_window: $('#modal_window'),
			modal_header: $('#modal_header'),
			modal_content: $('#modal_window_content'),
			modal_close: $('#modal_close, a[rel~=modal][rel~=close]'),
			modal_start_position: 100,
			modal_end_position: 200,
			title: options.title,
			content: options.content,
			classname: options.classname,
			stacked: options.stacked
		}
		
		o.f = {
			load: null,
			removeHandlers: null
		};
		
		var modal_window_top = $(window).scrollTop();

		if(o.v.modal_bg.length > 0)
		{
			o.v.modal_window.animate({top: (modal_window_top + o.v.modal_start_position), opacity: 0}, 500, function(){
				o.v.modal_content.attr('class', (o.v.classname ? o.v.classname : ''));
				o.v.modal_content.html(o.v.content);
				$('h2', o.v.modal_header).html(o.v.title);
				o.f.load();
			});
			
		}
		else
		{

			o.v.modal_bg = $('<div id="modal_bg"></div>');
			o.v.modal_window = $('<div id="modal_window"></div>').css('opacity', 0);
			o.v.modal_content = $('<div id="modal_window_content" class="'+(o.v.classname ? o.v.classname+' ' : '')+'clear-fix">'+o.v.content+'</div>');
			o.v.modal_header = $('<div id="modal_header"><h2>'+o.v.title+'</h2></div>');
			o.v.modal_close = $('<a href="" id="modal_close"></a>');
			
			o.v.modal_header.append(o.v.modal_close);
	
			o.v.modal_window.append(o.v.modal_header).append(o.v.modal_content).css('top', (modal_window_top + o.v.modal_start_position)+'px');
			o.v.modal_bg.height($(document).height()).width($(document).width());
	
			$('body').prepend(o.v.modal_bg).prepend(o.v.modal_window);

			o.v.modal_bg.fadeTo(500, 0.5, function(){
				o.f.load();
			});

		}

		// Close modal window
		o.v.modal_bg.add(o.v.modal_close)
			.bind('click', function(){
				o.v.modal_window.animate({top: (modal_window_top + o.v.modal_start_position), opacity: 0}, 500, function(){
					// If there are more modals to show, load them now
					if(o.v.stacked && o.v.stacked.length > 0)
					{
						var latest_in_stack = o.v.stacked.pop();
						$(this).modalContent({
							title: latest_in_stack.title,
							content: latest_in_stack.content,
							stacked: o.v.stacked
						});
					}
					// Otherwise remove the background
					else
					{
						o.v.modal_bg.fadeTo(500, 0, function(){
							o.f.removeHandlers();
							o.v.modal_bg.remove();
							o.v.modal_window.remove();
						});
					}
				});
				return false;
			});

		// Remove handlers
		o.f.removeHandlers = function(){
			$(window).unbind('scroll');
			o.v.modal_bg.add(o.v.modal_close)
				.unbind('click');
		};

		// Display content window
		o.f.load = function(){

			// Load content window
			o.v.modal_window.animate({top: (modal_window_top + o.v.modal_end_position), opacity: 1}, 500);

			// Generic event handlers
			$('.login form', o.v.modal_window).bind('submit', function(){
				var form = $(this);
				$.ajax({
					type: "POST",
					dataType: "json",
					url: "/api/",
					data: {
						'method': 'user',
						'function': 'authorise',
						'login_username': $('input[name=login_username]').val(),
						'login_password': $('input[name=login_password]').val(),
						'login_remember': $('input[name=login_remember]').val()
					},
					async : false,
					success: function(data){
						if(data.status == 'ok'){
							window.location.href = window.location.href;
						}else{
							var password_field = $('.field-login_password', form);
							var error_message = $('p.error', password_field);
							if(error_message.length == 1){
								error_message.text(data.content);
							}else{
								password_field.append('<p class="error">'+data.content+'</p>');
							}
						}
					}
				});

				return false;
			});

			$('.forgotten-password form', o.v.modal_window).bind('submit', function(){
				var form = $(this);

				$.ajax({
					type: "POST",
					dataType: "json",
					url: "/api/rest",
					data: {
						'method': 'smp.user.resetPassword',
						'email': $('input[name=forgot_email]').val()
					},
					async : false,
					success: function(data){
						var email_field = $('.field-forgot_email', form);
						var message = $('p.error', email_field);
						if(message.length == 1)
						{
							message.text(data.message);
						}
						else
						{
							email_field.append('<p class="error">'+data.message+'</p>');
						}
					}
				});

				return false;
			});

			$('a[rel*=close]', o.v.modal_window).bind('click', function(){
				o.v.modal_close.trigger('click');
				return false;
			});
			
			$(window).bind('scroll', function(){
				o.v.modal_window.css('top', ($(window).scrollTop() + o.v.modal_end_position)+'px');
			});

		};

	});
};

$.fn.promotedContent = function()
{
	$(this).each(function(){
		var o = $(this);
		var main = $('a.main', o);

		o
			.bind('mouseenter', function(){
				$('ul', o).animate({ 'left' : '0px' }, 500);
			})
			.bind('mouseleave', function(){
				$('ul', o).animate({ 'left' : '-100px' }, 500);
			});
		
		$('ul a', o).bind('click', function(){
			var large_src = $(this).find('img').attr('large-src');
			main
				.attr('href', $(this).attr('href'));
			main.find('img')
					.attr('src', large_src);

			return false;
		});
	});
}

$.fn.searchBar = function()
{
	$(this).each(function(){
		var o = $(this);
		
		var search_xhr = null;
		var search_input = $('input#search_terms', o);
		var search_submit = $('input[name="search_submit"]', o);
		var search_results = $('ul.results-main', o);
		var search_container = $('.searchbar-results', o);
		var search_term_last = search_input.val();
		var search_running = false;
		var result_selected = null;

		
		var timer = setInterval(function(){
			var search_term = search_input.val();
			if( search_term == 'Search terms' )
			{
				search_term = '';
			}

			if( search_xhr )
			{
				search_xhr.abort();
			}

			if( search_term && ( search_term != search_term_last ) )
			{
				search_term_last = search_term;
				search_running = true;
				search_xhr = $.ajax({
					type: "GET",
					dataType: "json",
					url: "/api/rest",
					data: {
						'method': 'smp.site.search',
						'term': search_term,
						'type': 'all'
					},
					async : true,
					success: function(data)
					{
						var playlists = data.playlists;
						var artists = data.artists;
						var tracks_albums = data.tracks_albums;
						var blog = data.blog;

						result_selected = null;

						o.process_results( blog, 'blog' );
						o.process_results( playlists, 'playlists' );
						o.process_results( artists, 'artists' );
						o.process_results( tracks_albums, 'tracks_albums' );

						if( (playlists.length || artists.length || tracks_albums.length || blog.length) > 0 )
						{
							search_container.fadeIn( 500 );
						}
						else
						{
							search_container.fadeOut( 500 );
						}
						search_running = false;
						search_xhr = null;
					}
				});
			}
		}, 2000);

		$('li', search_results).live('mouseenter', function(){
			$('li', search_results).removeClass('selected');
		});

		search_input
			.closest('form')
				.bind('submit', function(){
					search_input.trigger('focus');
					return false;
				});

		search_input
			.bind( 'focus', function(event){
				search_term_last = '';
			})
			.bind( 'blur', function(event){
				search_container.fadeOut(500);
				search_running = false;
				if( search_xhr )
				{
					search_xhr.abort();
				}
				search_xhr = null;
			})
			.bind( ($.browser.opera ? 'keypress' : 'keydown'), function(event){
				var key_code = event.which || event.keyCode;

				switch(key_code)
				{
					// Up arrow
					case 38:
						event.preventDefault();
						if(result_selected)
						{
							if( result_selected.prev().is('li') )
							{
								result_selected = result_selected.removeClass('selected').prev().addClass('selected');
							}
							else
							{
								result_selected.removeClass('selected');
								result_selected = null;
							}
						}
						break;
					// Down arrow
					case 40:
						event.preventDefault();
						if(result_selected)
						{
							if( result_selected.next().is('li') )
							{
								result_selected = result_selected.removeClass('selected').next().addClass('selected');
							}
						}
						else
						{
							result_selected = $('li.main:not(.no-results):first li:first', search_results).addClass('selected');
						}
						break;
					// Left arrow
					case 37:
						if( result_selected && result_selected.closest('li.main').is('.no-results.first') )
						{
							result_selected.removeClass('selected');
							result_selected = $('li.main:not(.no-results) li:first', search_results).addClass('selected')
						}
						else if( result_selected && result_selected.closest('li.main').is(':not(.first)') )
						{
							event.preventDefault();
							var search_result_list = result_selected.closest('li.main').prev();
							
							if(search_result_list.length > 0)
							{
								var selected_index = result_selected.index();
								result_selected.removeClass('selected');
								result_selected = $('li:eq('+selected_index+')', search_result_list);
								if( result_selected.length > 0 )
								{
									result_selected.addClass('selected');
								}
								else
								{
									result_selected = $('li:last', search_result_list).addClass('selected');
								}
							}

							if( search_result_list.is('.no-results') )
							{
								var e = jQuery.Event('keydown');
								e.which = 37;
								search_input.trigger(e);
							}
						}
						break;
					// Right arrow
					case 39:
						if( result_selected && result_selected.closest('li.main').is('.no-results.last') )
						{
							result_selected.removeClass('selected');
							result_selected = $('li.main:not(.no-results):last li:first', search_results).addClass('selected')
						}
						else if( result_selected && result_selected.closest('li.main').is(':not(.last)') )
						{
							event.preventDefault();
							var search_result_list = result_selected.closest('li.main').next();
							
							if(search_result_list.length > 0)
							{
								var selected_index = result_selected.index();
								result_selected.removeClass('selected');
								result_selected = $('li:eq('+selected_index+')', search_result_list);
								if( result_selected.length > 0 )
								{
									result_selected.addClass('selected');
								}
								else
								{
									result_selected = $('li:last', search_result_list).addClass('selected');
								}
							}

							if( search_result_list.is('.no-results') )
							{
								var e = jQuery.Event('keydown');
								e.which = 39;
								search_input.trigger(e);
							}
						}
						break;

					case 13:
						var selected_result = search_results.find('li.selected a');
						event.preventDefault();
						if( selected_result.length > 0 )
						{
							window.location = selected_result.attr('href');
						}
						else if( search_input.val().length > 0 )
						{
							search_input.closest('form').trigger('submit');
							return false;	
						}
						else
						{
							return false;	
						}
						break;
					default:
						if(result_selected)
						{
							result_selected.removeClass('selected');
							result_selected = null;
						}
						break;
				}
			});
		
		o.process_results = function( data, section )
		{
			var section_object = $('.'+section+' ul', search_results);
			section_object.html(data);
			if( section_object.find('li.no-results').length > 0 )
			{
				section_object.closest('li').addClass('no-results');
			}
			else
			{
				section_object.closest('li').removeClass('no-results');
			}
			
		}
	});
}

/*
 *	Playlist Generator
 */
$.fn.playlistGenerator = function()
{
	$(this).each(function()
	{
		var o = $(this);

		o.v = {
			table: ('table', o),
			table_head : $('thead', o),
			table_body : $('tbody', o),
			remaining_tracks : $.parseJSON( $('#remaining_tracks', o).val() ),
			button_add_playlist : $('div#spotify-playlist'),
			button_add_more_tracks : $('div.add-more-tracks a'),
			button_save : $('div.save-playlist'),
			button_another_track : $('a.button-mini-add', o),
			button_delete : $('a.button-mini-delete', o),
			button_replace : $('a.button-mini-replace', o)
		}
		
		o.v.button_add_more_tracks.bind('click', function(){
			var last_row = $('tr:last', o.v.table_body);
			var counter = 0;
			if( o.v.remaining_tracks.length > 0 )
			{
				while( ( track = o.v.remaining_tracks.pop() ) && counter < 10 )
				{
					if(track)
					{
						counter++;
						var new_row = last_row.clone().css('display', 'none');
						$('.track', new_row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
						$('.artist', new_row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+escape(track.artist)+'">'+track.artist+'</a>');
						$('.track-length', new_row).html(track.length_formatted);
						$('input', new_row).val(track.spotify_uri);
						o.v.table_body.append(new_row);
						new_row.fadeIn(500);
					}
				}
				o.v.sync_tracks();
			}
			o.v.button_save.fadeIn(500);
			o.v.check_form_more_tracks();
			return false;
		});
	
		$('a.button-mini-add', o).live('click', function(){
			var this_row = $(this).closest('tr');
			var found = false;
			var this_artist = $('.artist', this_row).text();
			var counter = 0;
			if( o.v.remaining_tracks.length > 0 )
			{
				
				$.each( o.v.remaining_tracks, function(key, track){
					if( track && ( track.artist == this_artist ) )
					{
						var new_row = this_row.clone().css('display', 'none');
						$('.track', new_row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
						$('.artist', new_row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+track.artist+'">'+track.artist+'</a>');
						$('.track-length', new_row).html(track.length_formatted);
						$('input', new_row).val(track.spotify_uri);
						this_row.after(new_row);
						new_row.fadeIn(500);
						delete o.v.remaining_tracks[key];
						return false;
					}
				});
				
				o.v.check_form_more_artist_tracks( this_artist );
				
				o.v.sync_tracks();
			}
			o.v.button_save.fadeIn(500);
			o.v.check_form_more_tracks();
			return false;
		});

		$('a.button-mini-delete', o).live('click', function(){
			$(this).closest('tr').remove();
			o.v.sync_tracks();
			o.v.button_save.fadeIn(500);
			return false;
		});
	
		$('a.button-mini-replace', o).live('click', function(){
			if( track = o.v.remaining_tracks.pop() )
			{
				var row = $(this).closest('tr');
				row.fadeTo(500, 0.1, function(){
					$('.track', row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
					$('.artist', row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+track.artist+'">'+track.artist+'</a>');
					$('.track-length', row).html(track.length_formatted);
					$('input', row).val(track.spotify_uri);
					$('a.button-mini', row).fadeTo(500, 1);
					$(this).fadeTo(500, 1);
				});

				o.v.sync_tracks();
			}
			o.v.check_form_more_tracks();
			o.v.button_save.fadeIn(500);
			return false;
		});
		
		o.v.check_form_more_artist_tracks = function( artist )
		{
			var found = false;
			$.each( o.v.remaining_tracks, function(key, track){
				if( track && ( track.artist == artist ) )
				{
					found = true;
					return false;
				}
			});

			if( found == false )
			{
				$('tr', o.v.table_body).each(function(){
					var this_artist = $('.artist', $(this)).text();
					if( this_artist == artist )
					{
						$('a.button-mini-add', $(this)).fadeTo(500, 0.2);
					}
				});
			}
		};
		
		o.v.check_form_more_tracks = function()
		{
			if(o.v.remaining_tracks.length === 0)
			{
				o.v.button_add_more_tracks.text('No More Tracks Available')
					.closest('.button').fadeTo(500, 0.2);
				$('a.button-mini-replace, a.button-mini-add', o).fadeTo(500, 0.2);
			}
		}
		
		o.v.sync_tracks = function()
		{
			var playlist_urls = [];
			$('input', o.v.table_body).each(function(){
				playlist_urls.push($(this).val());
			});
			$('em.track-count').text( $('tr', o.v.table_body).length );
			o.v.button_add_playlist.text(playlist_urls.join(' '));
		}
		
		o.v.check_form_more_tracks();
		o.v.sync_tracks();
		
	});

	$('div#spotify-playlist')
		.bind('mouseover', function(){
			$(this).trigger('focus');
			selectText();
		})
		.css('opacity', 0);

	// Scroll to newsletter sign-up
	$('.social-buttons li.email a').bind('click', function(){
		$.scrollTo('div#footer form.newsletter', 800, {
			onAfter: function(){
				$('div#footer form.newsletter input#subs_email').trigger('focus');
			}
		});
		return false;
	});
}

function selectText(){
	if (document.selection){
		var div = document.body.createTextRange();
		
		div.moveToElementText(document.getElementById("spotify-playlist"));
		div.select();
	}else{
		var div = document.createRange();
		
		div.setStartBefore(document.getElementById("spotify-playlist"));
		div.setEndAfter(document.getElementById("spotify-playlist")) ;
		
		window.getSelection().addRange(div);
	}
}

/*
	$('.social-buttons li.email a').bind('click', function(){
		$.scrollTo('div.block.newsletter', 800, {
			onAfter: function(){
				$('div.newsletter input#subs_email').trigger('focus');
			}
		});
		return false;
	});

	$('div.button-small-lastfm, div.button-small-twitter, div.button-small-facebook').each(function(){
		if( !$('a', this).attr('href') )
		{
			$(this).fadeTo(500, 0.3);
		}
	});

	$('form.submit-playlist input#spotify_url').bind('change', function(){
		$.ajax({
			type: "POST",
			dataType: "json",
			url: "/api/",
			data: {
				'method': 'spotify_api',
				'function': 'get_playlist',
				'playlist_url' : $(this).val()
			},
			async : false,
			success: function(data){
				if( data.status == 'ok' && data.content.title && data.content.title.length > 0 && $('form.submit-playlist input#playlist_title').val().length == 0 )
				{
					$('form.submit-playlist input#playlist_title').val(data.content.title);
				}
			}
		});
	});

	$('input[name="playlist_createartwork"]').live('click', function(){
		$('div.field-playlist_createartwork').fadeOut(500);
		$(this).closest('form').find('div.field-playlist_image div.input').fadeOut(500, function(){
			$(this).after('<p class="confirm-artwork">Artwork will be generated after submitting your playlist</p>');
		});
		$('input[name="playlist_createartwork_check"]').attr('checked', 'checked');
		return false;
	});

	$('div.field-playlist_image')
		.css('display', 'block');

	$('input[rel~=playlist][rel~=process]')
		.each(function(){
			$.ajax({
				type: "POST",
				dataType: "json",
				url: "/api/",
				data: {
					'method': 'tank',
					'function': 'process_playlist',
					'playlist_id' : $(this).val()
				},
				success: function(data){
					if( data.status == 'ok' )
					{
						$('form.playlist-submitted').fadeOut(500, function(){
							$('form.playlist-processed').fadeIn(500);
						});
					}
				}
			});
		});

	$('.social-buttons li.email a').bind('click', function(){
		
	});

	$('[rel~=connect]').bind('click', function(){
		var user = parseInt( $('#_u_id').val() );

		if(!user){
			$(this).modalContent(modal_login_template);
			return false;
		}else{
			return true;
		}
	});

	$('#playlist_image, #edit_image').each(function(){
		var o = $(this);
		
		o.wrap('<div class="input">').uploadify({
			'uploader'  : 'tpl/swf/jquery.uploadify.swf',
			'script'    : 'tpl/php/jquery.uploadify.php',
			'expressInstall' : 'tpl/swf/expressInstall.swf',
			'folder'    : '/uploads',
			'buttonImg' : 'tpl/img/jquery.uploadify.gif',
			'rollover'  : true,
			'auto'      : true,
			'multi'     : false,
			'fileExt'   : '*.jpg;*.jpeg;*.gif;*.png',
			'fileDesc'  : 'Image Files',
			'width'		: '60',
			'height'	: '30',
			onComplete	: function(event, ID, fileObj, response, data)
			{
				if( o.is('#playlist_image') )
				{
					o
						.parent().css('display', 'none')
						.closest('.form-field')
						.append('<img class="preview-image" src="thumb.php?m=fill&h=100&w=100&f='+fileObj.filePath+'" />');
				}
				else if( o.is('#edit_image') )
				{
					o
						.parent().css('display', 'none')
						.closest('.form-field')
						.find('img.preview-image')
							.attr('src', 'thumb.php?m=fill&h=100&w=100&f='+fileObj.filePath);
				}

				o
					.parent()
					.after('<input type="hidden" name="'+o.attr('name')+'" value="'+fileObj.filePath+'" />');
				o.remove();

			},
			onSelect	: function(){
				if( o.is('#playlist_image') )
				{
					$('div.field-playlist_createartwork').css('display', 'none');
				}
			}
		});
	});


	$('ul.profile-badges-full li:not(.acquired)').css('opacity', '0.3');


	$('div#spotify-playlist')
		.bind('mouseover', function(){
			$(this).trigger('focus');
			selectText();
		});

	$('form.genre .form-field-submit').css('display', 'none');
	$('form.genre .form-field-select select').bind('change', function(){
		$(this).closest('form').trigger('submit');
	});

	$('a[rel*=group][rel*=message][rel*=reply]').bind('click', function(){
				
		var link = $(this);
		var activity = $(this).closest('ul.activity');
		var post = $('form.wall:first', $(this).closest('li'));

		$('form.wall:visible:not(#'+post.attr('id')+')', activity).each(function(){
			$('a[rel*=group][rel*=message][rel*=reply]', $(this).closest('li')).trigger('click');
		});
		
		post.slideToggle(100, function(){
			if($(this).is(':visible')){
				link.text('Close');
			}else{
				link.text('Reply');
			}
		});
		
		return false;

	});

	if($('.field-wall_playlist').length > 0){
		$('.attach-playlist').css('display', 'block').find('a').live('click', function(){
	
			var link = $(this);
			$('.field-wall_playlist').slideToggle(500, function(){
	
				var playlists = $('.field-wall_playlist');
	
				if(playlists.is(':visible')){
					$(link).html('&#9650; Remove Playlist');
					$('option', playlists).removeAttr('selected');
					$('option:first', playlists).attr('selected', 'selected');
					$('span.text:first', playlists).html($('option:first', playlists).html());
				}else{
					$(link).html('&#9660; Attach Playlist');
				}
	
			});
	
			return false;
	
		});
	}

	$('p.artist-bio-full a, p.artist-bio-summary a').live('click', function(){
		if( $(this).parent().is('p.artist-bio-summary') )
		{
			$('p.artist-bio-summary').css('display', 'none');
			$('p.artist-bio-full').css('display', 'block');
		}
		else
		{
			$('p.artist-bio-summary').css('display', 'block');
			$('p.artist-bio-full').css('display', 'none');
		}
		return false;
	});

	$('a[rel~=user][rel~=artist][rel~=favourite][rel~=remove]').live('click', function(){
		var artist = $(this).attr('artist');
		var target = $(this);
		$.ajax({
			type: "POST",
			dataType: "json",
			url: "/api/",
			data: {
				'method': 'user',
				'function': 'favourite_artists',
				'artist': artist
			},
			async : false,
			success: function(){
				var list = target.closest('dd');
				if(list.length > 0)
				{
					target.closest('li').remove();
					var items = list.find('li');
	
					if(items.length == 0)
					{
						list.prev().remove();
						list.remove();
					}
				}
				else
				{
					window.location.href = window.location.href;
				}
			}
		});
		return false;
	});

	

	$('a[rel*=playlist][rel*=comment][rel*=reply]').bind('click', function(){
				
		var link = $(this);
		var activity = $(this).closest('ul.activity');
		var post = $('form.wall:first', $(this).closest('li'));

		$('form.wall:visible:not(#'+post.attr('id')+')', activity).each(function(){
			$('a[rel*=group][rel*=message][rel*=reply]', $(this).closest('li')).trigger('click');
		});
		
		post.slideToggle(100, function(){
			if($(this).is(':visible')){
				link.text('Close');
			}else{
				link.text('Reply');
			}
		});
		
		return false;

	});


	$('a[rel~=user][rel~=unfollow]')
		.bind('mouseenter', function(){
			$(this).html('Unfollow');
		})
		.bind('mouseleave' , function(){
			$(this).html('Following');
		});

	$('a[rel~=playlist][rel~=play]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$.ajax({
			type: "POST",
			dataType: "json",
			url: "/api/",
			data: {
				'method': 'playlists',
				'function': 'play_count',
				'pl_id': playlist_id
			},
			async : false
		});
		
	});

	$('a[rel~=user][rel~=delete]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$(this).modalContent({
			title: 'Delete this User',
			content: '<p>Are you sure you want to delete this user? This can\'t be un-done.</p>'
		 		+'<div class="button"><div class="button-left"><div class="button-right"><a href="'+$(this).attr('href')+'">Yes</a></div></div></div>'
				+'<div class="button button-green"><div class="button-left"><div class="button-right"><a rel="close" href="'+$(this).attr('href')+'">No</a></div></div></div>',
			classname: 'delete-playlist'
		});
		
		return false;
		
	});

	$('a[rel~=genre][rel~=delete]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$(this).modalContent({
			title: 'Delete this Playlist Genre',
			content: '<p>Are you sure you want to delete this playlist genre? This can\'t be un-done.</p>'
				+'<div class="button"><div class="button-left"><div class="button-right"><a href="'+$(this).attr('href')+'">Yes</a></div></div></div>'
				+'<div class="button button-green"><div class="button-left"><div class="button-right"><a rel="close" href="'+$(this).attr('href')+'">No</a></div></div></div>',
			classname: 'delete-playlist'
		});
		
		return false;
		
	});

	$('a[rel~=group][rel~=delete]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$(this).modalContent({
			title: 'Delete this Group',
			content: '<p>Are you sure you want to delete this group? This can\'t be un-done.</p>'
				+'<div class="button"><div class="button-left"><div class="button-right"><a href="'+$(this).attr('href')+'">Yes</a></div></div></div>'
				+'<div class="button button-green"><div class="button-left"><div class="button-right"><a rel="close" href="'+$(this).attr('href')+'">No</a></div></div></div>',
			classname: 'delete-playlist'
		});
		
		return false;
		
	});

	$('a[rel~=blog][rel~=delete]').bind('click', function(){
		var playlist_id = $('input:first', $(this).parent()).val();

		$(this).modalContent({
			title: 'Delete this Blog Post',
			content: '<p>Are you sure you want to delete this blog post? This can\'t be un-done.</p>'
				+'<div class="button"><div class="button-left"><div class="button-right"><a href="'+$(this).attr('href')+'">Yes</a></div></div></div>'
				+'<div class="button button-green"><div class="button-left"><div class="button-right"><a rel="close" href="'+$(this).attr('href')+'">No</a></div></div></div>',
			classname: 'delete-playlist'
		});
		
		return false;
		
	});
	
	$('.first-visit p.twitter a').live('click', function(){
		var twitter_follow = $('input#twitter-follow', $(this).closest('.first-visit'));
		if(twitter_follow.attr('checked'))
		{
			$(this).attr('href', $(this).attr('href')+'&twitter_follow=true');
		}
	});

	$('div.profile-left .advert').each(function(){
		
		if($('div.profile-right').height() > 600){
			$(this).css('display', 'block');
		}
		
	});

	$('#generator_link').bind('mouseenter', function(){
		var text = $(this).select().val();
	});

	$('div.playlist-generator').playlistGenerator();

	//$('select.input-select').formSelect();
	//$('div.form-field-checkbox input').formCheckbox();

	// Mark notifications as read
	$('ul.user-options li.main.notifications').bind({
		'mouseenter': function(){
			var target = $(this);
			$.ajax({
				type: "POST",
				dataType: "json",
				url: "/api/",
				data: {
					'method': 'user_notifications',
					'function': 'read_all'
				},
				async : false,
				success: function(){
					$('a.main span', target).remove();
				}
			});
		}
	});

	// Playlist Generator: Add Artist
	$('form.playlist-generator div.field-artist_name p a').bind('click', function(){
		var artist_name_input_clone = $('<input type="text" value="" id="artist_name" name="artist_name[]" class="data input-text" />');
		artist_name_input_clone = $('input.input-text:last', $(this).closest('div.form-field')).after(artist_name_input_clone).next();
		artist_name_input_clone.val('').fadeIn(500);
		return false;
	});

	// Initiate search bar
	$('div.searchbar-top').searchBar();

	// Initiate promoted content
	$('div.promoted').promotedContent();

	// Check for user notifications
	$.checkUpdates();

});

$.fn.promotedContent = function()
{
	$(this).each(function(){
		var o = $(this);
		
		o.bind('mouseenter', function(){
			$('ul', o).animate({ 'left' : '0px' }, 500);
		});
		
		o.bind('mouseleave', function(){
			$('ul', o).animate({ 'left' : '-100px' }, 500);
		});
	});
}

$.fn.searchBar = function()
{
	$(this).each(function(){
		var o = $(this);
		
		var search_xhr = null;
		var search_input = $('input#search_terms', o);
		var search_submit = $('input[name="search_submit"]', o);
		var search_results = $('ul.results-main', o);
		var search_container = $('.searchbar-results', o);
		var search_term_last = search_input.val();
		var search_running = false;
		var result_selected = null;

		
		var timer = setInterval(function(){
			var search_term = search_input.val();
			if( search_term == 'Search terms' )
			{
				search_term = '';
			}

			if( search_xhr )
			{
				search_xhr.abort();
			}

			if( search_term && ( search_term != search_term_last ) )
			{
				search_term_last = search_term;
				search_running = true;
				search_xhr = $.ajax({
					type: "POST",
					dataType: "json",
					url: "/api/",
					data: {
						'method': 'search',
						'term': search_term,
						'type': 'all'
					},
					async : true,
					success: function(data)
					{
						var playlists = data.content.results.playlists;
						var artists = data.content.results.artists;
						var tracks_albums = data.content.results.tracks_albums;
						var blog = data.content.results.blog;

						result_selected = null;

						o.process_results( blog, 'blog' );
						o.process_results( playlists, 'playlists' );
						o.process_results( artists, 'artists' );
						o.process_results( tracks_albums, 'tracks_albums' );

						if( (playlists.length || artists.length || tracks_albums.length || blog.length) > 0 )
						{
							search_container.fadeIn( 500 );
						}
						else
						{
							search_container.fadeOut( 500 );
						}
						search_running = false;
						search_xhr = null;
					}
				});
			}
		}, 2000);

		$('li', search_results).live('mouseenter', function(){
			$('li', search_results).removeClass('selected');
		});

		search_input
			.closest('form')
				.bind('submit', function(){
					search_input.trigger('focus');
					return false;
				});

		search_input
			.bind( 'focus', function(event){
				search_term_last = '';
			})
			.bind( 'blur', function(event){
				search_container.fadeOut(500);
				search_running = false;
				if( search_xhr )
				{
					search_xhr.abort();
				}
				search_xhr = null;
			})
			.bind( ($.browser.opera ? 'keypress' : 'keydown'), function(event){
				var key_code = event.which || event.keyCode;

				switch(key_code)
				{
					// Up arrow
					case 38:
						event.preventDefault();
						if(result_selected)
						{
							if( result_selected.prev().is('li') )
							{
								result_selected = result_selected.removeClass('selected').prev().addClass('selected');
							}
							else
							{
								result_selected.removeClass('selected');
								result_selected = null;
							}
						}
						break;
					// Down arrow
					case 40:
						event.preventDefault();
						if(result_selected)
						{
							if( result_selected.next().is('li') )
							{
								result_selected = result_selected.removeClass('selected').next().addClass('selected');
							}
						}
						else
						{
							result_selected = $('li.main:not(.no-results):first li:first', search_results).addClass('selected');
						}
						break;
					// Left arrow
					case 37:
						if( result_selected && result_selected.closest('li.main').is('.no-results.first') )
						{
							result_selected.removeClass('selected');
							result_selected = $('li.main:not(.no-results) li:first', search_results).addClass('selected')
						}
						else if( result_selected && result_selected.closest('li.main').is(':not(.first)') )
						{
							event.preventDefault();
							var search_result_list = result_selected.closest('li.main').prev();
							
							if(search_result_list.length > 0)
							{
								var selected_index = result_selected.index();
								result_selected.removeClass('selected');
								result_selected = $('li:eq('+selected_index+')', search_result_list);
								if( result_selected.length > 0 )
								{
									result_selected.addClass('selected');
								}
								else
								{
									result_selected = $('li:last', search_result_list).addClass('selected');
								}
							}

							if( search_result_list.is('.no-results') )
							{
								var e = jQuery.Event('keydown');
								e.which = 37;
								search_input.trigger(e);
							}
						}
						break;
					// Right arrow
					case 39:
						if( result_selected && result_selected.closest('li.main').is('.no-results.last') )
						{
							result_selected.removeClass('selected');
							result_selected = $('li.main:not(.no-results):last li:first', search_results).addClass('selected')
						}
						else if( result_selected && result_selected.closest('li.main').is(':not(.last)') )
						{
							event.preventDefault();
							var search_result_list = result_selected.closest('li.main').next();
							
							if(search_result_list.length > 0)
							{
								var selected_index = result_selected.index();
								result_selected.removeClass('selected');
								result_selected = $('li:eq('+selected_index+')', search_result_list);
								if( result_selected.length > 0 )
								{
									result_selected.addClass('selected');
								}
								else
								{
									result_selected = $('li:last', search_result_list).addClass('selected');
								}
							}

							if( search_result_list.is('.no-results') )
							{
								var e = jQuery.Event('keydown');
								e.which = 39;
								search_input.trigger(e);
							}
						}
						break;

					case 13:
						var selected_result = search_results.find('li.selected a');
						event.preventDefault();
						if( selected_result.length > 0 )
						{
							window.location = selected_result.attr('href');
						}
						else if( search_input.val().length > 0 )
						{
							search_input.closest('form').trigger('submit');
							return false;	
						}
						else
						{
							return false;	
						}
						break;
					default:
						if(result_selected)
						{
							result_selected.removeClass('selected');
							result_selected = null;
						}
						break;
				}
			});
		
		o.process_results = function( data, section )
		{
			var section_object = $('.'+section+' ul', search_results);
			section_object.html(data);
			if( section_object.find('li.no-results').length > 0 )
			{
				section_object.closest('li').addClass('no-results');
			}
			else
			{
				section_object.closest('li').removeClass('no-results');
			}
			
		}
	});
}

$.fn.playlistGenerator = function()
{
	$(this).each(function()
	{
		var o = $(this);

		o.v = {
			table: ('table', o),
			table_head : $('thead', o),
			table_body : $('tbody', o),
			remaining_tracks : $.parseJSON( $('#remaining_tracks', o).val() ),
			button_add_playlist : $('div#spotify-playlist'),
			button_add_more_tracks : $('div.add-more-tracks a'),
			button_save : $('div.save-playlist'),
			button_another_track : $('a.button-mini-add', o),
			button_delete : $('a.button-mini-delete', o),
			button_replace : $('a.button-mini-replace', o)
		}
		
		o.v.button_add_more_tracks.bind('click', function(){
			var last_row = $('tr:last', o.v.table_body);
			var counter = 0;
			if( o.v.remaining_tracks.length > 0 )
			{
				while( ( track = o.v.remaining_tracks.pop() ) && counter < 10 )
				{
					if(track)
					{
						counter++;
						var new_row = last_row.clone().css('display', 'none');
						$('.track', new_row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
						$('.artist', new_row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+escape(track.artist)+'">'+track.artist+'</a>');
						$('.track-length', new_row).html(track.length_formatted);
						$('input', new_row).val(track.spotify_uri);
						o.v.table_body.append(new_row);
						new_row.fadeIn(500);
					}
				}
				o.v.sync_tracks();
			}
			o.v.button_save.fadeIn(500);
			o.v.check_form_more_tracks();
			return false;
		});
	
		$('a.button-mini-add', o).live('click', function(){
			var this_row = $(this).closest('tr');
			var found = false;
			var this_artist = $('.artist', this_row).text();
			var counter = 0;
			if( o.v.remaining_tracks.length > 0 )
			{
				
				$.each( o.v.remaining_tracks, function(key, track){
					if( track && ( track.artist == this_artist ) )
					{
						var new_row = this_row.clone().css('display', 'none');
						$('.track', new_row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
						$('.artist', new_row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+track.artist+'">'+track.artist+'</a>');
						$('.track-length', new_row).html(track.length_formatted);
						$('input', new_row).val(track.spotify_uri);
						this_row.after(new_row);
						new_row.fadeIn(500);
						delete o.v.remaining_tracks[key];
						return false;
					}
				});
				
				o.v.check_form_more_artist_tracks( this_artist );
				
				o.v.sync_tracks();
			}
			o.v.button_save.fadeIn(500);
			o.v.check_form_more_tracks();
			return false;
		});

		$('a.button-mini-delete', o).live('click', function(){
			$(this).closest('tr').remove();
			o.v.sync_tracks();
			o.v.button_save.fadeIn(500);
			return false;
		});
	
		$('a.button-mini-replace', o).live('click', function(){
			if( track = o.v.remaining_tracks.pop() )
			{
				var row = $(this).closest('tr');
				row.fadeTo(500, 0.1, function(){
					$('.track', row).html('<a title="View lyrics from this track" href="artists/'+escape(track.artist)+'/track/'+escape(track.title)+'/lyrics">'+track.title+'</a>');
					$('.artist', row).html('<a title="Create playlist based on '+track.artist+'" href="playlist-generator/artist/'+track.artist+'">'+track.artist+'</a>');
					$('.track-length', row).html(track.length_formatted);
					$('input', row).val(track.spotify_uri);
					$('a.button-mini', row).fadeTo(500, 1);
					$(this).fadeTo(500, 1);
				});

				o.v.sync_tracks();
			}
			o.v.check_form_more_tracks();
			o.v.button_save.fadeIn(500);
			return false;
		});
		
		o.v.check_form_more_artist_tracks = function( artist )
		{
			var found = false;
			$.each( o.v.remaining_tracks, function(key, track){
				if( track && ( track.artist == artist ) )
				{
					found = true;
					return false;
				}
			});

			if( found == false )
			{
				$('tr', o.v.table_body).each(function(){
					var this_artist = $('.artist', $(this)).text();
					if( this_artist == artist )
					{
						$('a.button-mini-add', $(this)).fadeTo(500, 0.2);
					}
				});
			}
		};
		
		o.v.check_form_more_tracks = function()
		{
			if(o.v.remaining_tracks.length === 0)
			{
				o.v.button_add_more_tracks.text('No More Tracks Available')
					.closest('.button').fadeTo(500, 0.2);
				$('a.button-mini-replace, a.button-mini-add', o).fadeTo(500, 0.2);
			}
		}
		
		o.v.sync_tracks = function()
		{
			var playlist_urls = [];
			$('input', o.v.table_body).each(function(){
				playlist_urls.push($(this).val());
			});
			$('em.track-count').text( $('tr', o.v.table_body).length );
			o.v.button_add_playlist.text(playlist_urls.join(' '));
		}
		
		o.v.check_form_more_tracks();
		o.v.sync_tracks();
		
	});
}



/*$.fn.formCheckbox = function(){
	$(this).each(function(){
		var o = $(this);
		o.v = {
			checkbox_styled : null,
			label : o.prev()
		}

		o.v.checkbox_styled = o
			.css('display', 'none')
			.after('<a class="input-checkbox" href=""></a>')
			.next();

		if(o.is(':checked')){
			o.v.checkbox_styled.addClass('checked');
		}

		o.v.checkbox_styled.add(o.v.label).bind('click', function(){
			if(o.is(':checked')){
				o.removeAttr('checked');
				o.v.checkbox_styled.removeClass('checked');
			}else{
				o.attr('checked', 'checked');	
				o.v.checkbox_styled.addClass('checked');
			}
			return false;
		});

	});
};

$.fn.formSelect = function(){
	$(this).each(function(){
		var o = $(this);
		o.v = {
			select_styled : null,
			selected : $('option:selected', o),
			styled_options: null
		}

		var html = '<ul class="input-select"><li><a class="main" href=""><span class="text">'+o.v.selected.text()+'</span><span class="arrow"></span></a><ul>';
		$('option', o).each(function(index, value){
			var option = $(this);
			html += '<li'+(option.is(':selected') ? ' class="selected"' : '')+'><a href="">'+option.text()+'</a><input value="'+index+'" type="hidden" /></li>';
		});
		html += '</ul></li></ul>';

		o.v.select_styled = o
			.css('display', 'none')
			.after(html)
			.next();

		o.v.styled_options = $('ul', o.v.select_styled);
		
		if( $('li', o.v.styled_options).length > 10 ){
			o.v.styled_options.height(300);
		}
		
		$('a.main', o.v.select_styled).bind('click', function(){
			o.v.styled_options.toggle();
			return false;
		});

		$('ul a', o.v.select_styled).bind('click', function(){
			$('li', o.v.styled_options).removeClass('selected');
			o.v.styled_options.toggle();
			var target = $(this).parent().addClass('selected');
			var index = $('input', target).val();
			$('a.main span.text', o.v.select_styled).text($(this).text());
			$('option:eq('+index+')', o).attr('selected', 'selected');
			o.trigger('change');
			return false;
		});

	});
};*/

/*
	jQuery Plugins
*/
jQuery.fn.outerHTML = function(s) {
	return (s) ? this.before(s).remove() : jQuery("<p>").append(this.eq(0).clone()).html();
};

jQuery.trimContent = function( string, length, hellip ) {
	if( string.length > length )
	{
		return string.substr(0, length)+( hellip == true ? '&hellip;' : '' );
	}
	else
	{
		return string;	
	}
};

$.fn.disableSelection = function() {
    $(this).attr('unselectable', 'on')
        .css('-moz-user-select', 'none')
        .each(function() { 
            this.onselectstart = function() { return false; };
        });
};

