/*******************************************************************************

	NowTrax Main JS File

*******************************************************************************/

// http://jdbartlett.github.com/innershiv | WTFPL License
window.innerShiv=(function(){var d,r;return function(h,u){if(!d){d=document.createElement('div');r=document.createDocumentFragment();/*@cc_on d.style.display = 'none'@*/}var e=d.cloneNode(true);/*@cc_on document.body.appendChild(e);@*/e.innerHTML=h.replace(/^\s\s*/, '').replace(/\s\s*$/, '');/*@cc_on document.body.removeChild(e);@*/if(u===false)return e.childNodes;var f=r.cloneNode(true),i=e.childNodes.length;while(i--)f.appendChild(e.firstChild);return f}}());


/* Globals */
var ajaxErrorMsg = $('#ajaxerror'),
	ajaxFailedMsg = $('#ajaxfailed');

/**
 * Bind main jQuery setup scripts to document.ready event:
 */
jQuery(document).ready(function($) {

	// Force HTTPS users to HTTP:
	if ( window.location.protocol === 'https:' )
		window.location = window.location.href.replace('https', 'http' );
	
	// For debugging:

	/**
	 * Set up jPlayer
	 */	
	// Cache DOM objects for jPlayer:
	var jPlayerWrapper = $('#audio-player'),
	    jPlayer = jPlayerWrapper.find('#jplayer'),
	    jpCurrentTrack = jPlayerWrapper.find('.jp-currentTrack');

	// Set up the jPlayer
	jPlayer.jPlayer({
		ready: function () {
				jPlayerWrapper.removeClass('preload');
		},
		solution: "flash, html",
		cssSelectorAncestor: '#jp-player-wrapper',
		swfPath: 'http://www.nowtrax.com/_js/libs/jplayer',   // folder containing swf fallback file
		supplied: 'mp3',  // supplied file formats
		preload: 'auto',
		volume: 1
	});
	
	
	
	/**
	 * Bind all current and future clicks on Play buttons:
	 * 
	 * Uses .live() so that binding is applied to new AJAX-written elements:
	 */
	$('a.play').live('click', function() {
		
		// Cache clicked link:
		var clicked = $(this),
			trackObject = clicked.parent('article.track'),
			trackId = trackObject.data('trackid'),
			addtocartBtn = trackObject.find('.add-to-cart'),
			shareBtns = trackObject.find('.share-track'),
			updateCount = false;
	
		// Check whether audio player is already open:
		if ( $('html').hasClass('jplayer-active') ) {
			// Just play the track
		} else {
			$('html').addClass('jplayer-active');
			
			// Open the player and play the track:
			jPlayerWrapper.animate({top:0},400);
		}
		
		// Is this track currently playing?:
		if ( clicked.hasClass('playing') ) {
			
			// Pause the track:
			jPlayer.jPlayer('pause');
	
			// Update play button:
			clicked.removeClass('playing');
			
		} else {
			
			// Is this track already loaded in the audio player?:
			if ( jpCurrentTrack.data('currentTrackId') === clicked.attr('id') ) {
				
				// Track already loaded in player
				
			} else {
				
				// Track not loaded, Update current track in jPlayer controls:
				jpCurrentTrack.data('currentTrackId', clicked.attr('id') );
				jpCurrentTrack.find('.track-title').html( trackObject.find('.track-title').html() );
				jpCurrentTrack.find('.track-artwork').html( trackObject.find('.track-artwork').html() );
				jpCurrentTrack.find('.track-info').html( trackObject.find('.track-info').html() );
				jPlayerWrapper.find('.track-price').text( trackObject.find('.track-price').text() );
				jPlayerWrapper.find('#share-this-track .facebook a').attr('href', shareBtns.find('.facebook a').attr('href'));
				jPlayerWrapper.find('#share-this-track .twitter a').attr('href', shareBtns.find('.twitter a').attr('href'));
				jPlayerWrapper.find('#share-this-track .share a').attr('href', shareBtns.find('.share a').attr('href'));

				if ( addtocartBtn.length ) { 
					jPlayerWrapper.find('.button').addClass('add-to-cart').removeClass('disabled')
								  .attr( 'rel', addtocartBtn.attr('rel') );
				} else {
					// Track is unavailable/already bought:
					jPlayerWrapper.find('.button').addClass('disabled').removeClass('add-to-cart');
				}
				
				jPlayerWrapper.find('.fileformat').data( 'formatid', trackObject.find('.fileformat').data( 'formatid' ) );
				
				// Set media on jPlayer element and play it:
				jPlayer.jPlayer('setMedia', {
					mp3:clicked.attr('href') 
				});
				
				// Fire AJAX call to update play count, when done loading:
				updateCount = 1;
			}
			
			// Play the track:
			jPlayer.jPlayer('play');
	
			// Update play button:
			$('a.play.playing').removeClass('playing');
			clicked.addClass('playing');
			$('.track.current').removeClass('current');
			trackObject.addClass('current');
			
			// Fire AJAX call to update play count:
			if ( updateCount ) {
				ex_jqXHR = $.ajax({
					url : '_app/trackPlayed.php',
					data : { track_id: trackId },
					error: function (ex_jqXHR, textStatus, errorThrown) {
					},
					success: function (data, textStatus, ex_jqXHR) {
					}
				});
			}

		}
		
		// Prevent further link action:
		return false;
	});


	
	/** 
	 * Set up playlist functionality
	 * 
	 * When current track ends, finds next track and triggers a click on its play button.
	 * If no next track is found, skips back to first track in playlist.
	 * 
	 * Using ".jp-autoplay" namespace so we can easily remove this event if autoplay is disabled
	 *
	 * @todo Try to replace the above with a call to the 'More' button to trigger next ten tracks.
	 */
	jPlayer.bind($.jPlayer.event.ended + ".jp-autoplay", function(event) {
		
		// Get current track's Play button
		var currentPlayButton = $('a.play#'+jpCurrentTrack.data('currentTrackId') );
		
		// Find next track's Play button and trigger a click.
		// This simulates the effect of a dynamically updating playlist by using the track order in HTML:
		var nextPlayButton = currentPlayButton
			.parents('.track') // ...find the playing track's article object
			.nextAll('.track:first') // ...jump to next track
			.find('a.play') // ...find that track's play button
			.click(); // ...click it. phew!
		
		// If that was the last track (no next Play button found), start again from first track:
		if ( ! nextPlayButton.length ) {
			$('.track-list').children('.track:first').find('a.play').click();
		}
		
	});

	
	/**
	 * jPlayer controls: play button click event:
	 */
	jPlayerWrapper.find('.jp-play').bind('click', function(event) {
		
		// Clicked play on audio player controls - update play button on track object:
		$('a.play#'+jpCurrentTrack.data('currentTrackId')).addClass('playing');
		
	});
	

	/**
	 * jPlayer controls: pause button click event:
	 */
	jPlayerWrapper.find('.jp-pause').bind('click', function(event) {
		
		// Clicked Stop/Pause on player controls - update play button on track object:
		$('a.play.playing').removeClass('playing');
	});
	
	
	/**
	 * jPlayer controls: close-player button click event:
	 */
	jPlayerWrapper.find('#close-player').bind('click', function(event) {
	
		$('html').removeClass('jplayer-active');
		$('.track.current').removeClass('current');
		
		jPlayerWrapper.find('.jp-pause').click();
		
		// Open the player and play the track:
		jPlayerWrapper.animate({top:"-52px"},400);
		
		return false;
		
	});
		
	
	/**
	 * Scrolltop links scroll to top to highlight page refresh:
	 */
	$('a.scrolltop').live('click', function() {
		$('html, body').animate({scrollTop:0}, 400);
	});





	/**
	 * Set up SuperFish menu hovers
	 */
	$('nav.lang').find('a').click(function() {
		// Block UI
		$.blockUI();
		
		// Send AJAX to update cookie for lang
		$.ajax({
			url: '_app/updateLang.php',  // sets language cookie
			data: { lang: $(this).attr('rel') },
			error: function(jqXHR, textStatus, errorThrown) {
				if ( errorThrown === 'timeout' ) {
					// Increment the attempt counter:
					this.tryCount++;

					// Show timeout / retry error:
					ajaxErrorMsg.fadeIn(300).find('.attempt').text(this.tryCount);
					
					// Try again if allowed, or fail completely:
					if (this.tryCount <= this.retryLimit) {
						// Resend the AJAX jqXHR request:
						$.ajax(this);
					} else {
						// Maximum attempts reached, show fail error:
						ajaxErrorMsg.hide();
						ajaxFailedMsg.show();
					}
					// Stop everything else:
					return false;
				} else if ( errorThrown === 'abort' ) {
					// AJAX aborted:
					$.unblockUI();
				} else {
					// Unknown error:
					$.unblockUI();
				}
			},
			success: function(data) {
				// Refresh page with new language cookie set:
				window.location.reload();
			}
		});
		
		return false;
	});
	
	



	/**
	 * Set up SuperFish menu hovers
	 */
	$('nav.lang ul').add('.user ul').superfish({
		animation:   {opacity:'show', height: 'toggle'},
		speed:       300,
		delay:       700,
		autoArrows:  false,
		dropShadows: false
	});
	
	/**
	 * Close submenus on click
	 */
	$('.submenu').find('a').bind('click', function() {
		var a = $(this),
			s = a.parents('.submenu');
		
		s.hide();
		setTimeout(function() {
			s.removeAttr('style');
		}, 1000);
	});
	
	
	/**
	 * Facebox popups
	 */
	$('a[rel*=facebox]').live('mousedown', function() {
		return false;
		/* $(this).facebox(); */
	});
	
	
	/**
	 * External links open in new tab:
	 */
	$('a[rel*=external]').live('mousedown', function() {
		$(this).attr('target', '_blank');
	});
	$('a[rel*=nofollow]').live('mousedown', function() {
		$(this).attr('target', '_blank');
	});
	
});
