$(document).ready(function() {
	// info alert recursive loop
	startAlerts();
	
	$('a:not(a.track_play,a.btn_pause,a.track_add,a.track_remove,a.dialog,a.logout,a.button,a.btn,a.external,a.nofollow,div#recaptcha_area a,div#fileInputQueue a)').live('click',function() {
		var target = $(this).attr('href');
		if (!$.support.hrefNormalized) {
			target = target.replace(baseUrl, "");
		};
		$.address.value(target);   // sets the hash value for the history plugin and triggers the page render
		return false;
	});
	
	$('a.external').live('click',function() {
		return confirm('The link you just clicked on will take you to another website. Are you sure you want to leave Aucadia.com? Doing so will mean that any music you have playing will stop.');
	});
	
	$('div.collapse_expand').live('click',function() {
		if ($(this).hasClass('expanded')) {
			$(this).removeClass('expanded').html('show tracks').parent().siblings('table.playlist').slideUp().addClass('collapsed');
		} else {
			$(this).addClass('expanded').html('hide tracks').parent().siblings('table.playlist').slideDown().addClass('expanded').removeClass('collapsed');
		};
		return false;
	});
	
	$('#player_main').resizable({
		handles:'s'
	});
	
	// JQGRID STUFF
	
	jQuery("#player_playlist").jqGrid({
	   	url:$('#root_url').attr('href')+'tracks/get.json',
		datatype: "json",
	   	colNames:['▶','Name','Artist','Length','Play Count','Recommendations', 'Share Price','Date Added', 'Img path','Waveform', 'Download'],
	   	colModel:[
			{name:'playing',index:'playing', width:17, align:"right", sortable:false},
	   		{name:'name',index:'Track.title', width:250, align:"left"},
	   		{name:'artist',index:'Artist.name', width:220, align:"left"},
			{name:'length',index:'Track.length', width:55, align:"right"},
	   		{name:'play_count',index:'Track.play_count', width:90, align:"right"},
			{name:'recommendations',index:'Track.recommendation_count', width:130, align:"right", hidden:true},
			{name:'share_price',index:'Artist.share_price', width:150, align:"right"},
			{name:'date',index:'Track.created', width:150, align:"right"},
			{name:'img',index:'img', width:320, align:"left", sortable:false, hidden:true},
			{name:'waveform',index:'waveform', width:0, align:"left", sortable:false, hidden:true},
			{name:'download',index:'download', width:320, align:"left", sortable:false, hidden:true}
	   	],
	   	rowNum:20,
	   	rowList:[10,20,30],
	   	pager: '#pager2',
	   	sortname: 'Track.play_count',
	    viewrecords: true,
	    sortorder: "desc",
	    caption:false,
		altRows:true,
		hidegrid:false
	});
	
	$('ul.playlist_list li').live('click',function() {
		$('#load_player_playlist').show();
		var generate_playlist_url = $(this).find('a').attr('href');
		$.ajax({
			url : generate_playlist_url,
			method : "GET",
			dataType : 'json',
			success : function(data) {
				$('#load_player_playlist').hide();
				if (data!="null") {
					var mygrid = jQuery("#player_playlist")[0];
					var response = eval(data);
					mygrid.addJSONData(response);
				} else {
					alert('Error loading search results.');
				};
			}
		});
	});
	
	$('#hud_progress_clickable_layer').mousemove(function(e) {
		if (global_trackid!=null) {
			var xcord = e.pageX - $('#hud_progress_clickable_layer').offset().left;
			$('#hud_hover_playhead').css('marginLeft',xcord+'px');
			$('#track_progress_indicator').css('width',xcord+'px');
		};
	}).mouseenter(function() {
		if (global_playstate!="playing"&&global_trackid!=null) {
			$('#hud_hover_playhead').show();
		};
	}).mouseleave(function() {
		if (global_playstate!="playing"&&global_trackid!=null) {
			$('#hud_hover_playhead').hide();
		};
	}).click(function(e) {
		if (global_trackid!=null) {
			var relative_x = e.pageX - $('#waveform').offset().left;
			var pos = Math.floor((relative_x/$('#waveform').width())*100);
			playTrackPos(pos);
		};
	});
	
	$('#btn_show_playlist').click(function() {
		if ($(this).hasClass('open')) {
			hidePlaylist();
			return false;
		} else {
			showPlaylist();
			return false;
		};
	});
	
	$('#btn_play').click(function() {
		if (jQuery(this).hasClass('playing')) {
			pauseTrack();
			return false;
		} else if($(this).hasClass('paused')) {
			if (global_trackid!=null) {
				playTrack(global_trackid);
				return false;
			};
		} else if(global_playstate=="stopped") { // no tracks have been played yet
			var first_track = $('#player_playlist tr:first');
			if (first_track.length>0) {
				playTrack(first_track.attr('id'));
			};
			showPlaylist();
		};
	});
	
	$('ul.playlist_list li').hover(function() {
		$(this).addClass('ui-state-hover');
	},function() {
		$(this).removeClass('ui-state-hover');
	}).click(function() {
		$('ul.playlist_list li.ui-state-highlight').removeClass('ui-state-highlight');
		$(this).addClass('ui-state-highlight')
	});
	
	// set cleardefault behaviour
	$('input.cleardefault').focus(function() {
		if (!$(this).hasClass('cleared')) {
			$(this).val('').addClass('cleared');
		};		
	});
	
	// Feedback
	$('#feedback_tab').click(function() {
		var status = $(this).attr('class');
		//console.info(status);
		if (status=='closed') {
			feedback_open();	
		} else if(status=='opened') {
			feedback_close();
		};
	});
	
	$('#feedback_close').click(function() {
		feedback_close();
	});
	
	// popup hover behaviour
	$('div.popup').live('mouseover',function(e) {
		$(this).children('div.popup_container').clone().appendTo('div#popup_container').show();
		$('#popup_container').css('top',(e.pageY-60)+'px').css('left',(e.pageX)+'px').show();
	}).live('mouseout',function() {
		$('#popup_container').hide().empty();
	});
	
	// dialog links
	
	$('#dialog').dialog({
		autoOpen: false,
		width: 420,
		open: function(event,ui) {
			$('html, body').animate({scrollTop:0}, 0);
			setTimeout(function(){$('#dialog input:first').focus()},400);
		}
	});
	
	$('#login_dialog').dialog({
		autoOpen: false,
		width: 370,
		title: 'Login',
		open: function(event,ui) {
			$('html, body').animate({scrollTop:0}, 0);
			setTimeout(function(){$('#login_dialog input:first').focus()},400);
		}
	});
	
	$('a.btn_login').live('click',function() {
		$('#login_dialog').dialog('open');
		setTimeout(function() {$('#UserEmail').focus()},500);
		return false;
	});
	
	$('#user_login_form').validate({
		rules: {
			email: {
				required: true,
				email: true
			},
			password: {
				required: true
			}
		},
		messages: {
			name: {
				required: 'Please enter your email address'
			},
			password: {
				required: 'Please enter your password'
			}
		},
		submitHandler: function() {
			$('#user_login_form button.positive').addClass('disabled').attr('disabled','disabled');
			showLoader();
			var login_str = $('#user_login_form').serialize();
			var login_url = $('#root_url').attr('href')+'users/ajaxLogin';
			var login_method = 'POST';
			ajaxLogin(login_url,login_method,login_str);
			return false;
		},
		success: function(label) {
			label.removeClass('error')
		}
	});
	
	$('a.dialog').live('click',function() {
		$('#dialog').dialog('close');
		showLoader();
		$('#dialog').dialog('option', 'title', $(this).html()).load($(this).attr('href'),null,function() {
			hideLoader();
			$('#dialog').dialog('open');
		});	
		return false;
	});
	
	$('.hover_elements').live('mouseover',function() {
		$(this).find('.hover_element').show();
	}).live('mouseout',function() {
		$(this).find('.hover_element').hide();
	});
	
	// catch post form submits that need to refresh page
	$('button.ajax').live('click',function() {
		showLoader();
		var post_url = $(this).parents('form').attr('action');
		var method = $(this).parents('form').attr('method');
		var data = $(this).parents('form').serialize();
		//alert('url='+post_url+',method='+method);
		ajaxSubmit(post_url,method,data);
		return false;
	});

	$('a.button:not(a.dialog,a.nofollow)').live('click',function() {
		showLoader();
		ajaxSubmit($(this).attr('href'));
		return false;
	});
	
	// catch feedback submit
	$('#feedback_submit').click(function() {
		$(this).attr('disabled','disabled').addClass('disabled');
		$('#feedback_message').hide();
		//$('#feedback_form').hide();
		$('#feedback_loader').show();
		
		$.post($('#feedback_form form').attr('action'),$('#feedback_form form').serialize(),function(data) {
			$('#feedback_loader').hide();
			Recaptcha.reload();
			$('#feedback_submit').removeAttr('disabled').removeClass('disabled');
			if (data=='true') {
				//$('#feedback_smiley').show();
				$('#feedback_message').show();
				$('#FeedbackBody').val('');
			} else {
				Recaptcha.reload();
				//$('#feedback_form').show();
				alert("Error: "+data+". There was a problem submitting your feedback. It could be a problem with our feedback system or it could be that you mistyped the two words in the box. Please try once again and if it still doesn't work come back and try another time. Sorry!");
			};			
		});
		return false;
	});
	
	// karma button
	$('a.karma_up').live('click',function() {
		changeKarma('1',this);
		return false;
	});
	
	$('a.karma_down').live('click',function() {
		changeKarma('-1',this);
		return false;
	});
	
	// RECOMMEND
	
	$('#btn_recommend').click(function() {
		if (authUser) {
			$(this).addClass('disabled').attr('disabled','disabled');
			$('#dialog').dialog('close');
			showLoader();
			$('#dialog').dialog('option', 'title', $(this).html()).load($(this).attr('href'),null,function() {
				hideLoader();
				$('#dialog').dialog('open');
			});	
			return false;
		} else {
			showAlert("You need to be logged in to recommend a track");
			return false;
		};
	});
	
	$('.disabled').live('click',function() {
		return false;
	});
	
	// JPLAYER STUFF
	
	// initialise the volume slider
	
	$("#volume_slider").slider({
		orientation: "horizontal",
		range: "min",
		min: 0,
		max: 100,
		value: 80,
		slide: function(event, ui) {
			$("#jp").jPlayer('volume',ui.value);
		}
	});
	
	$("#progress_slider").slider({
		range: "min",
		min: 0,
		max: 100,
		value: 0,
		slide: function(event, ui) {
			playTrackPos(ui.value);
		}
	});

	$("#jp").jPlayer({
		swfPath: $('#root_url').attr('href')+'js',
		ready: function () {
			//loadNextTrack();
			initialise_player();
		},
		errorAlerts: true,
		warningAlerts: true
	});

	// initialise sortable playlist
	$("table#player_playlist tbody").sortable({
		axis: 'y'
	});
	
	$('#btn_next').click(skipNext);
	
	$('#btn_previous').click(skipPrevious);
	
	$('a#clear_playlist').click(clearPlaylist);
	
	// new jPlayer methods events for jqgrid 21/04/10
	
	$('table#player_playlist tr').live('dblclick',function() {
		playTrack($(this).attr('id'));
		return false;
	});
	
	$('a.track_play').live('click',function() {		
		// check to see if the playlist is currently loaded
		var playlist_id = getPlaylistId($(this).parents('table.playlist'));
		if (playlist_id!=global_playlist_id) {
			loadPlaylist(playlist_id);
		};
		
		// set this track as playing 
		var classes = $(this).parents('tr.track').attr('class');
		var temp = new Array();
		temp = classes.split(' ');
		playTrack(temp[0]);
		return false;
	});
	
	$('a.btn_play_all').live('click',function() {
		if ($(this).hasClass('playing')) {
			pauseTrack();
			$('a.btn_play_all.playing').removeClass('playing').html('Play All');
		} else {
			var playlist = $(this).parent().next();
			var playlist_id = getPlaylistId(playlist);
			if (playlist_id!=global_playlist_id) {
				loadPlaylist(playlist_id);
			};
			var track_id = $('#player_playlist tr:first').attr('id');
			playTrack(track_id);
			//$('#jp').play();
			global_playstate = 'playing';
			//setPlaying();	
			//logPlay();
		};
		return false;
	});
	
	$('a.btn').live('click',function() {
		return false;
	});
	
	$('a.btn_pause').live('click',function() {
		pauseTrack();	
		return false;
	});
	
	$('a.track_add').live('click',function() {
		var classes = $(this).parents('table#player_playlist tr').attr('class');
		var temp = new Array();
		temp = classes.split(' ');
		var track_id = temp[0];
		showPlaylist();
		setTimeout(function(){addToPlaylist(track_id)},400);
		setTimeout('hidePlaylist()',3500);
		return false;
	});
	
	$('a.track_remove').live('click',function() {
		$(this).parents('table#player_playlist tr').slideUp('slow',function() {
			$(this).remove();
		});	
		return false;		
	});
	
	$('a.load_messages').live('click',function() {
		inject_messages($(this).attr('href'));
		return false;
	});
	
	$('#logout').live('click',function() {
		jQuery.get(jQuery(this).attr('href'),null,function() {
			afterLogin();
			var random = Math.floor(Math.random()*101);
			ajaxRender(current_page+'?u='+random);
			pushInfoAlert('You have logged out successfully. We hope to see you again soon.');
		});
		return false;
	});
	
	$('button.dialogSubmit').live('click',function() {
		showLoader();
		var form = $(this).parents('form')
		var str = form.serialize();
		dialogSubmit(form.attr('action'),'POST',str);
		ajaxRender(current_page);
		return false;
	});
	
	$('#playlist_name').keyup(function() {
		var t = this; 
		$('#playlist_name_spinner').show();
		if (this.value != this.lastValue) {
			if (this.timer) clearTimeout(this.timer);

			this.timer = setTimeout(function () {
				var serialized_playlist = serialize_playlist();
				$.ajax({
					data : 'name='+$('#playlist_name').val()+'&tracks_str='+serialized_playlist,
					type : 'post',
					url : $('#playlist_form').attr('action'),
					success : function(data, textStatus, XMLHttpRequest) {
						$('#playlist_name_spinner').hide();
						$('#playlist_name_response').html(data);
					}
				});
			}, 2000);

			this.lastValue = this.value;
		}
	});
	
	// scroll opacity stuff
	$(window).scroll(function() {
		//alert($(window).scrollTop());
		if (isScrollTop()) {
			//alert('solid');
			solidifyHeader();
		} else {
			//alert('fade');
			fadeHeader();
		};
	});
	
	$('#header').hover(solidifyHeader,function() {
		if (!isScrollTop()) {
			fadeHeader();
		}
	});
	
	$(document).keypress(function(e) {
		// if (!global_inputfocus) {
		// 			var code = (e.keyCode ? e.keyCode : e.which);
		// 			//alert(code);
		// 			switch(code) { 
		// 				// User pressed spacebar
		// 				// case 32:
		// 				// 					if (global_playstate=='stopped'||global_playstate=='paused') {
		// 				// 						playTrack(global_trackid);
		// 				// 					} else {
		// 				// 						pauseTrack();
		// 				// 					};
		// 				// 					return false;	            
		// 				// 				break;
		// 
		// 				case 39:
		// 					skipNext();
		// 					return false;
		// 				break;
		// 
		// 				case 37:
		// 					skipPrevious();
		// 					return false;
		// 				break;
		// 				
		// 				// enter
		// 				case 13:
		// 					return false;
		// 				break;
		// 			}
		// 		};
	});
	
	jQuery.extend({
		textCounter: function(field,cntfield,maxlimit) {
			var value = $(field).val();
			if (value.length > maxlimit) // if too long...trim it!
				$(field).val(value.substring(0, maxlimit));
			// otherwise, update 'characters left' counter
			else		
				$(cntfield).html(maxlimit - value.length);
		}
	});
	
	$.extend($.fn.disableTextSelect = function() {
			return this.each(function(){
				if($.browser.mozilla){//Firefox
					$(this).css('MozUserSelect','none');
				}else if($.browser.msie){//IE
					$(this).bind('selectstart',function(){return false;});
				}else{//Opera, etc.
					$(this).mousedown(function(){return false;});
				}
			});
		});
		$('.noSelect').disableTextSelect(); //No text selection on elements with a class of 'noSelect'

	$.address.change(ajaxRender);
}); // end of startup stuff

function render(data) {
	$("#content").slideUp({
		duration:'slow',
		easing: 'easeOutSine',
		complete: function() {
			$('html, body').animate({scrollTop:0}, 0);
			$(this).html(data).slideDown({
				duration:'slow', 
				easing:'easeInSine'
			});
			FB.init({appId: '124409747587425', status: true, cookie: true, xfbml: true});
		}
	});
}

// Function that updates the user details in the header. Is called when user logs in via ajax.
function afterLogin() {
	var random = Math.floor(Math.random()*101);
	$.get($('#root_url').attr('href')+'users/getUserNav?u='+random,null,function(data) {
		$('#user_nav_container').html(data);
	});
}

function updateBalance(balance) {
	$('div#user_balance_balance').html(balance);
}

function ajaxSubmit(url,method,data) {
	if ( typeof(method) == 'undefined' ){
		method = 'GET';
	}	
	if ( typeof(data) == 'undefined' ){
		data = null;
	}
	$.ajax({
		type: method,
		url: url,
		data: data,
		success: function(data) {
			$('#dialog').dialog('close');
			ajaxRender(current_page); // rerenders the current page
		}
	});
}

function dialogSubmit(url,method,data) {
	if ( typeof(method) == 'undefined' ){
		method = 'GET';
	}	
	if ( typeof(data) == 'undefined' ){
		data = null;
	}
	$('button.dialogSubmit').attr('disabled','disabled').addClass('disabled');
	$.ajax({
		type: method,
		url: url,
		data: data,
		success: function(data) {
			hideLoader();
			$('#dialog').html(data);
			$('button.dialogSubmit').removeAttr('disabled','true').removeClass('disabled');
		}
	});
}

function ajaxLogin(login_url,login_method,login_data) {
	var post_url = login_url+'?'+login_data +"&random="+ Math.random();
	$.get(post_url,function(msg) {
		hideLoader();
		jQuery('#user_login_form button.positive').removeClass('disabled').removeAttr('disabled');
		if (msg=='false') {
			alert('The email address and password you entered did not match our records. Please check and try again.');
		} else {
			jQuery('#login_dialog').dialog('close');
			var random = Math.floor(Math.random()*101);
			ajaxRender(current_page+'/?u='+random); // rerenders the current page
			afterLogin();
		};
	});
}

function ajaxRender(event) {
	
	var	method = 'GET';	
	var	data = null;
	
	if (typeof(event) == 'object') {
		var post_url = event.path;
	} else {
		var post_url = event;
	};

	// assigns the correct url to post_url if it's the homepage and doesn't reload if it's the first page
	if (post_url=='/') {
		if (current_page==location.href) {
			post_url = null;
		} else {
			post_url = $('#root_url').attr('href');
		};
	};
	
	if (post_url!=null) { // checks that a URL is present
		current_page = post_url;
		if (ajax_request) { // checks for an existing ajax request
			ajax_request.abort(); // aborts request
		}
		showLoader();
		ajax_request = jQuery.ajax({ // start the AJAX request
			type: method,
			cache: false,
			url: post_url, // the URL we are retrieving
			data: data, // in this case we are not sending any data
			success: function(data) { // execute the below if the AJAX goes according to plan
				hideLoader();
				render(data);
				afterRender();
				return false;
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) { // execute this if it all goes tits up
				alert(textStatus + errorThrown);
				return false;
			}
		});
	};
};

function inject_messages(messages_url) {
	$('div.black_spinner').show();
	$('li.earlier').hide();
	$.get(messages_url,function(data) {
		jQuery('<div/>')
			.append(data)
			.hide()
			.prependTo('ul#message_list')
			.slideDown('slow');
		$('div.black_spinner').hide();
	});
}

function afterRender() {
	//$('a.external').attr('target','_blank');
}

// JPLAYER functions

function initialise_player() {
	// give loaded playlist correct class
	$('table.playlist.'+global_playlist_id).addClass('inPlayer');
	$('#jp').jPlayer('onSoundComplete',endOfSong).jPlayer('onProgressChange',progressChange);
}

function loadNextTrack() {
	//check to see if a track has just finished
	if ($('table#player_playlist tr.inPlayer').length > 0) {
		
	} else { // this is the first track
		// so play the first track that's on the current playlist
		var track_id = getId($('div#player_playlist table tr:first'));
		loadTrack(track_id,false);
	};
}

function playTrack(track_id) {
	//alert('here');
	if ($('#player_playlist tr#'+track_id).hasClass('inPlayer')&&global_playstate=='paused') { // if the track is already loaded
		//console.info('Player :: resuming paused track');
	} else {
		loadTrack(track_id);
	}
	$('#jp').jPlayer('play');
	global_playstate = 'playing';
	setPlaying();
	logPlay();
}

function setPlaying() {
	// remove paused class from any paused tracks
	$('table#player_playlist tr.paused').removeClass('paused');
	$('table.playlist.'+global_playlist_id+' table#player_playlist tr.'+global_trackid+' div.btn_play').hide();
	$('table.playlist.'+global_playlist_id+' table#player_playlist tr.'+global_trackid+' div.btn_pause').show();
	
	// remove nowPLaying class from any other tracks 
	$('table#player_playlist tr.nowPlaying').removeClass('nowPlaying').find('td:first').html('');
	// set the track as currently playing
	$('table.playlist.'+global_playlist_id+' table#player_playlist tr.'+global_trackid).addClass('nowPlaying');
	$('table#player_playlist tr#'+global_trackid).addClass('nowPlaying');
	
	// new playlist stuff
	jQuery('#btn_play').removeClass('paused').addClass('playing');
	// set playlist table row playing icon
	$('table#player_playlist tr#'+global_trackid+' td:first').html('▶');
	
	// set playlist as playing
	$('table.playlist.'+global_playlist_id).parent().find('a.btn_play_all').addClass('playing').html('<span></span>Pause');
	
	// set playing favicon
	favicon.change($('#favicon_playing').attr('href'));
	
	// make sure playhead is visible
	$('#hud_hover_playhead').show();
}

//pos is a percentage to start the track from
function playTrackPos(pos) {
	//calculate what the corresponding positions is in milliseconds
	var ms = (global_tt / 100) * pos;
	$('#jp').jPlayer('playHeadTime',ms);
	setPlaying();
}

function extractInnerContent(content) {
	var content_div = $("table#player_playlist td:contains('"+content+"') div.playlist_content").html();
	if (content_div) {
		return content_div;
	} else {
		return false;
	};
}

function loadTrack(track_id,load) {
	var inner_content = extractInnerContent($('table#player_playlist').getCell(track_id,'name'));
	if (inner_content) {
		$('#hud_track_title').html(inner_content);
		$('#hud_artist_name').html(extractInnerContent($('table#player_playlist').getCell(track_id,'artist')));
	} else {
		$('#hud_track_title').html($('table#player_playlist').getCell(track_id,'name'));
		$('#hud_artist_name').html($('table#player_playlist').getCell(track_id,'artist'));
	};
	
	// update the recommend button
	$('#btn_recommend').attr('href',$('#root_url').attr('href')+'recommendations/add/'+track_id);
	
	// show the recommended button again
	if ($('#btn_recommend').hasClass('disabled')) {
		$('#btn_recommend').removeClass('disabled').removeAttr('disabled');
	};
	
	global_trackid = track_id;
	global_track_counted = false;
	
	// fetch artist img for this track
	var img_url = $('table#player_playlist').getCell(global_trackid,'img');
	$('#now_playing_img').attr('src',img_url);
	var waveform_url = $('table#player_playlist').getCell(global_trackid,'waveform');
	$('#waveform').attr('src',waveform_url+'.png');
	$('#waveform_played').attr('src',waveform_url+'_played.png').show();
	
	$('table.playlist table#player_playlist tr.inPlayer div.btn_play').show();
	$('table.playlist table#player_playlist tr.inPlayer div.btn_pause').hide();
	
	// set the track_id global var
	global_trackid = track_id;
	
	var track_url = $('table#player_playlist').getCell(global_trackid,'download');
	// //console.info(track_url);
	// $('#loaded_track table tbody').html('');
	// $('table.playlist tbody table#player_playlist tr.'+track_id+':first').clone().removeClass('highlight_odd').appendTo('#loaded_track table tbody');
	$('#player_playlist tr.inPlayer').removeClass('inPlayer');
	$('#player_playlist tr#'+track_id).addClass('inPlayer');
	// 
	//alert('here');
	if (load!=false) { // i don't even know why this works but it does
		$('#jp').jPlayer('setFile',track_url);
	};	
}

function pauseTrack() {
	global_playstate = 'paused';
	
	// new playlist stuff
	$('#btn_play').removeClass('playing').addClass('paused');
	// set playlist table row playing icon
	$('table#player_playlist tr#'+global_trackid+' td:first').html('▮▮');
	
	$('#jp').jPlayer('pause');
	$('table#player_playlist tr.'+global_trackid+' div.btn_play').show();
	$('table#player_playlist tr.'+global_trackid+' div.btn_pause').hide();
	$('table#player_playlist tr.'+global_trackid).addClass('paused');
	
	// set paused favicon
	favicon.change($('#favicon_paused').attr('href'));
	
	// set playlist as playing
	$('a.btn_play_all.playing').removeClass('playing').html('<span></span>Play All');
}

function skipNext() {
	endOfSong();
}

function skipPrevious() {
	if (global_ppa <= 5 && isPreviousTrack()) { // if the track is less than 5% the way through and there is a track before it
		var track_id = getId($('table#player_playlist tr.nowPlaying').prev('table#player_playlist tr'));
		playTrack(track_id);
	} else {
		$("#jp").jPlayer('playHeadTime',0); // Begins playing at the start.
	};
}

function showPlaylist() {
	var expanded_playlist_height = $(window).height() - 115 + 'px';
	var playlist_toggle = $('#btn_show_playlist');
	if (playlist_toggle.hasClass('closed')) {
		$('#player_main').animate({
			height: expanded_playlist_height,
			paddingBottom: '26px'
		},{
			duration: 1600,
			easing: 'easeOutBounce'
		});
		playlist_toggle.html('<span></span>hide playlist').removeClass('closed').addClass('open');
	};
}

function hidePlaylist() {
	var playlist_toggle = $('#btn_show_playlist');
	if (playlist_toggle.hasClass('open')) {
		$('#player_main').animate({
			height:'0px',
			paddingBottom: '0px'
		},{
			duration: 1300,
			easing: 'easeOutBounce'
		});
		playlist_toggle.html('<span></span>show playlist').removeClass('open').addClass('closed');
	};
}

function addRow(old_row) {
	var row = $(old_row);
	var row_id = row.attr('class').split(' ')[0];
	var data = {
		playing : '',
		name : "<div class='playlist_content'>"+row.find('td.track_name a.oneline').html()+"</div><div class='playlist_arrow'><a onclick='playlist_onclick(this);return false;' class='playlist_arrow' href='"+row.find('td.track_name a.oneline').attr('href')+"'><span class='image_span'></span></a></div>",
		artist : "<div class='playlist_content'>"+row.find('td.artist_name a.artist_name').html()+"</div><div class='playlist_arrow'><a onclick='playlist_onclick(this);return false;' class='playlist_arrow' href='"+row.find('td.artist_name a.artist_name').attr('href')+"'><span class='image_span'></span></a></div>",
		length : row.find('td.length').html(),
		play_count : row.find('td.play_count').html(),
		recommendations : row.find('td.recommendation_count').html(),
		share_price : row.find('td.share_price').html(),
		date : row.find('td.date').html(),
		img : row.find('td.img').html(),
		waveform : row.find('td.waveform').html(),
		download : row.find('a.track_play').attr('href')
	};
	$('#player_playlist').addRowData(row_id,data);
}

function loadPlaylist(playlist_id) {
	clearPlaylist();
	if (playlist_id=='newslist') {
		//$('table.playlist.'+playlist_id+':not(.large)').clone().replaceAll('#player_playlist_container table.playlist');
		$('table.playlist.'+playlist_id+':not(.large) tr').each(function() {
			addRow(this);
		});
	} else {
		//$('table.playlist.'+playlist_id).clone().replaceAll('#player_playlist_container table.playlist');
		$('table.playlist.'+playlist_id+' tr').each(function() {
			addRow(this);
		});
	};
	$('table.playlist.inPlayer').removeClass('inPlayer');
	$('table.playlist.'+playlist_id).addClass('inPlayer');
	
	global_playlist_id = playlist_id;
	
	// if nothing has been set playing, play the first track
	// if (global_playstate!='playing') {
	// 		var track_id = $('#player_playlist tr:first').attr('id');
	// 		playTrack(track_id);
	// 	};
	showPlaylist();
}

function logPlay() {
	// get the playlist id currently playing
	if (is_int(global_playlist_id)) {
		$.get($('#root_url').attr('href')+'tracks/logPlay/'+global_trackid+'/playlist_id:'+global_playlist_id);
	} else {
		$.get($('#root_url').attr('href')+'tracks/logPlay/'+global_trackid);
	};
}

function is_int(value){
	if((parseFloat(value) == parseInt(value)) && !isNaN(parseInt(value))){
		return true;
	} else {
		return false;
	}
}

// function first increases client's play_count and then increases server-side
function increasePlayCount() {
	var new_play_count = parseInt($('#player_playlist').getCell(global_trackid,"play_count")) + 1;
	$('#player_playlist').setCell(global_trackid,"play_count",new_play_count);
	$.get($('#root_url').attr('href')+'tracks/increasePlayCount/'+global_trackid);
}

function endOfSong() {
	//check to see if there is a track next in the playlist
	if (isNextTrack()) {
		var track_id = getId($('table#player_playlist tr#'+global_trackid).next('table#player_playlist tr'));
		playTrack(track_id);
	} else { // it's the last track on the playlist
		stopPlay();
	};	
}

function isNextTrack() {
	if ($('table#player_playlist tr#'+global_trackid).next('table#player_playlist tr').length > 0) {
		return true;
	} else {
		return false;
	};
}

function isPreviousTrack() {
	if ($('table#player_playlist tr#'+global_trackid).prev('table#player_playlist tr').length > 0) {
		return true;
	} else {
		return false;
	};
}

function stopPlay() {
	$('#jp').jPlayer("stop");
	$('table#player_playlist tr.inPlayer div.btn_play').show();
	$('table#player_playlist tr.inPlayer div.btn_pause').hide();
	
	// set default favicon
	favicon.change($('#favicon_default').attr('href'));
}

function getId(element) {
	return element.attr('id');
}

function addToPlaylist(track_id) {
	$('table.playlist tr.'+track_id+':first').clone().hide().appendTo('#player_playlist table.playlist').fadeIn('slow');
}

function showLoader() {
	$('#header_loader').slideDown();
}

function hideLoader() {
	$('#header_loader').slideUp();
}

function progressChange(lp,ppr,ppa,pt,tt) {
	$('#progress_slider').slider('option','value',ppa);
	// log the track count
	if ((ppa>90)&&!global_track_counted) {
		increasePlayCount();
		global_track_counted = true;
	}
	
	//var new_ppa = Math.floor(ppa);
	// if (global_ppa<new_ppa) {
	// 		var interval = Math.floor(tt/100);
	// 		$('#track_progress_indicator').animate({
	// 			width : new_ppa+"%"
	// 		},interval);
	// 		$('#hud_hover_playhead').animate({
	// 			marginLeft : new_ppa+'%'
	// 		},interval);
	// 	};
	
	// update the variable holding the absolute current played percentage
	global_ppa = Math.floor(ppa);
	global_tt = tt;
	$('#hud_LHtime').html(convertTime(pt));
	$('#hud_RHtime').html(convertTime(-tt+pt));
	$('#track_progress_indicator').css('width',ppa+'%');
	$('#hud_hover_playhead').css('marginLeft',ppa+'%');
}

function convertTime(milliseconds) {
	if (milliseconds) {
		var seconds = milliseconds / 1000;
		var mins = Math.floor(seconds/60);
		var secs = Math.floor(seconds % 60);
		if (secs<0) {
			secs = secs-(2*secs);
			if (secs>59) {
				secs = 0;
			};
			mins = mins + 1;
		};
		if (secs<10) {
			secs = "0"+secs;
		};
		return mins+":"+secs;
	};
}

function clearPlaylist() {
	$('#player_playlist').clearGridData();
	
	// set default favicon
	favicon.change($('#favicon_default').attr('href'));
	return false;
}

function feedback_open() {
	Recaptcha.create("6LfqeAsAAAAAAKdVij16EpSrspJjpS4T947lSR0d",
	"recaptcha_container", {
	   theme: "red"
	});
	$('#feedback_form').show();
	$('#feedback_smiley').hide();
	$('#feedback_message').hide();
		
	$('#feedback_panel').animate({
	marginRight : '0px'
	},{queue:false, duration:900, easing: 'easeOutBounce', complete: function() {
		$('#feedback_tab').removeClass('closed').addClass('opened');
		$('#FeedbackBody').focus();
		//console.info($('#feedback_tab').attr('class'));
	}});
}

function feedback_close() {
	$('#feedback_panel').animate({
		marginRight : '-329px'
		},{queue:false, duration:600, easing: 'easeOutBounce', complete: function() {
			$('#feedback_tab').removeClass('opened').addClass('closed');
			Recaptcha.destroy();
			//console.info($('#feedback_tab').attr('class'));
		}});
}

function pushInfoAlert(alert) {
	emptyAlertStack();
	showAlert(alert,12000);
}

function addToAlertStack(alert) {
	infoAlerts.push(alert);
}

function emptyAlertStack() {
	infoAlerts.length = 0;
}

function showAlert(alert,duration) {
	$('#info_alert').html(alert);
	$('#info_alert_row').animate({
		height : '15px'
		},{queue:false, duration:300, easing: 'easeOutSine'});
	setTimeout("hideAlert()",duration);
}

function hideAlert() {
	$('#info_alert_row').animate({
		height : '0px'
		},{queue:false, duration:200, easing: 'easeOutSine', complete: function() {
			//$('#info_alert').html('');
		}});
}

function startAlerts() {
	if (infoAlerts.length>0) {
		if (info_item>=infoAlerts.length) {
			info_item = 0;
		}
		showAlert(infoAlerts[info_item],20000); // displays alert
		info_item++;	
	}	
	setTimeout('startAlerts()',60000); // restarts function after timeout
}

function serialize_playlist() {
	var tracks_string = '';
	$('#player_playlist_container table.playlist tr').each(function() {
		var classes = $(this).attr('class');
		var classes_array = classes.split(' ');
		tracks_string += classes_array[0]+',';
	});
	return tracks_string;
}

function changeKarma(change,element) {
	var user_id = getId($(element).parents('div.user.block'));	
	$.get($('#root_url').attr('href')+'users/changeKarma/'+user_id+'/karma:'+change,null,function(data,textStatus,XMLHttpRequest) {
		//refresh all user boxes
		if (is_int(data)) {
			$('div.user.block.'+user_id+' div.karma').fadeOut('fast',function() {
				hideLoader();
				$(this).html(data).fadeIn('fast');
			});
		};
	});
}

function isScrollTop() {
	var scrollPosition = $(window).scrollTop();
	return (scrollPosition <= 40);
}

function solidifyHeader() {
	if (global_header_opacity=="faded") {
		$('#main_navigation,#player').fadeTo("slow",1);
		global_header_opacity = "solid";
	};	
}

function fadeHeader() {
	if (global_header_opacity=="solid") {
		$('#main_navigation,#player').fadeTo("slow",0.33);
		global_header_opacity = "faded";
	};
}

function changeTitle(title) {
	document.title = title;
}

function changeMeta(meta) {
	metatags = document.getElementsByTagName("meta");
	for (cnt = 0; cnt < metatags.length; cnt++)
	{
		var property = metatags[cnt].getAttribute("property");
		// Update the Title meta tag
		if (typeof(meta["title"])!=undefined&&property == "og:title") {
			metatags[cnt].setAttribute("content", meta["title"]);
		} else if (typeof(meta["type"])!=undefined&&property == "og:type") {
			metatags[cnt].setAttribute("content", meta["type"]);
		} else if (typeof(meta["url"])!=undefined&&property == "og:url") {
			metatags[cnt].setAttribute("content", meta["url"]);
		} else if (typeof(meta["image"])!=undefined&&property == "og:image") {
			metatags[cnt].setAttribute("content", meta["image"]);
		};
	}
}

function getPlaylistId(element) {
	var target_playlist_classes = element.attr('class');
	var target_playlist_id = target_playlist_classes.split(' ');
	return target_playlist_id[0];
}

function playlist_onclick(element) {
	var href_attr = element.getAttribute('href');
	if (!$.support.hrefNormalized) {
		href_attr = href_attr.replace(baseUrl, "");
	};
	$.address.value(href_attr);   // sets the hash value for the history plugin and triggers the page render
	hidePlaylist();
	return false;
}

function fnGetDomain(url) {
   return url.match(/:\/\/(.[^/]+)/)[1];
}

// stores base url
var baseUrl = "http://"+fnGetDomain(window.location.href);

// tracks whether the current track play has been logged yet
var global_track_counted = false;

// declare array that pushes info to status bar
var infoAlerts = new Array();

// keeps track of the last alert to be displayed
var info_item = 0;

// stores the current page
var current_page = location.href;

// stores the auth status
var authUser = false;

// stores current track id
var global_trackid = null;

// stores the current playlist id
var global_playlist_id = 'popular';

// stores the current state of jplayer
var global_playstate = 'stopped';

// Stores the value of percentage of track loaded
var global_lp = 0;

// stores the absoluted played percentage
var global_ppa = 0;

// stores the total length of the current track in milliseconds
var global_tt = 0;

// true if user is typing into a text box
var global_inputfocus = false;

var global_header_opacity = "solid";

var ajax_request = null; // variable to hold the current request
