/* 
Peter Petrucci.com
http://www.peterpetrucci.com

(c) James Eunson 2009
All Rights Reserved
http://www.jameseunson.com 
*/

(function($) {

	/******************************************/
	// Site music samples
	// Contained in separate objects for each logical grouping
	/******************************************/
	var samples = {
		nowherePlaylist : [
			{mp3:"http://peterpetrucci.com/audio/nowhere/1.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/2.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/3.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/4.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/5.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/6.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/7.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/8.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/9.mp3"},
			{mp3:"http://peterpetrucci.com/audio/nowhere/10.mp3"}																											
		],
		messagePlaylist : [
			{mp3:"http://peterpetrucci.com/audio/message/1.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/2.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/3.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/4.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/5.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/6.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/7.mp3"},
			{mp3:"http://peterpetrucci.com/audio/message/8.mp3"}
		],
		fromwithinPlaylist : [
			{mp3:"http://peterpetrucci.com/audio/fromwithin/1.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/2.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/3.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/4.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/5.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/6.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/7.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/8.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/9.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/10.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/11.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/12.mp3"},
			{mp3:"http://peterpetrucci.com/audio/fromwithin/13.mp3"}						
		],
		riverstoryPlaylist : [
			{mp3:"http://peterpetrucci.com/audio/riverstory/1.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/2.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/3.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/4.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/5.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/6.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/7.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/8.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/9.mp3"},
			{mp3:"http://peterpetrucci.com/audio/riverstory/10.mp3"}
		],
		sidebarPlaylist : [
			{name:"Thought Forms",album:"Nowhere to be Found",mp3:"http://peterpetrucci.com/audio/thoughtforms.mp3"},
			{name:"Valse",album:"From Within",mp3:"http://peterpetrucci.com/audio/valse.mp3"},
			{name:"My Favourite Things",album:"River Story",mp3:"http://peterpetrucci.com/audio/myfavouritethings.mp3"},
			{name:"Giant Steps",album:"Messages from the Past",mp3:"http://peterpetrucci.com/audio/giantsteps.mp3"}
		]
	};
	
	pp = {
		
		PHOTOS_LEFT_BOUND: 40,
		PHOTOS_RIGHT_BOUND: -425,
		DISCS_LEFT_BOUND: 40,
		DISCS_RIGHT_BOUND: -760,

		sf: 10,
		moving: false,
		
		playsource: 'player',
		
		playing : false,
		
		/******************************************/
		// Main initialization
		/******************************************/
		init : function()
		{		
			var self = this;
			
			self.initSidebar();
			self.initPlayer();
			
		},
		
		/******************************************/
		// Initalize Discography
		/******************************************/
		initDiscography : function()
		{
			$('.wrapper.discography .disc').eq(1).hide(); // Hide side discography
			
			// Facilitate mini-navigation bar in discography section
			$('ul#nav_disc a').each(function(i){
				$(this).bind('click', function(e){
					e.preventDefault();
					$('ul#nav_disc a').removeClass('selected').eq(i).addClass('selected');
					
					$('.wrapper.discography .disc')
						.eq(i)
						.siblings('.disc')
						.fadeOut('fast', function(){
							$('.wrapper.discography .disc').eq(i).fadeIn('fast');
					});
					
				});
			});
		},	
		
		/******************************************/
		// Initalize Sidebar
		/******************************************/
		initSidebar : function()
		{
			$('#sidebar li:odd').addClass('off');
			
			$('#sidebar ul.news li, #sidebar ul.events li').hide();
			
			// Get news
			$.getJSON("/get/news", function(data){	
				if(data.length > 0) {
					$('#sidebar p#news_none').hide();
				}
				$.each(data, function(i){
					$('#sidebar ul.news li').eq(i).css('display','block');
					$('#sidebar ul.news li').eq(i).find('h3').html(this.title);
					$('#sidebar ul.news li').eq(i).find('span').html(this.description);
					$('#sidebar ul.news li').eq(i).find('a').attr('href', '#news');
				});
				if($.browser.msie && $.browser.version < 8) {
					$('#sidebar ul.news a').click(function(e){
						$.historyLoad('news');
					});
				}
				$('#news_loader').fadeOut('fast');
			});
		},
		
		/******************************************/
		// Initalize Photo Slider
		/******************************************/
		initPhotos : function()
		{
			var self = this;
			var photos_offset = 0;
			
			$('.photos_inner').css('left', 0 ); // Initalize inner container
		
			// Photos left hover
			$('.photos_wrapper .left_over').hover(function(e){
				self.moving = true; 
				self.move('left', $('.photos_inner'), 'photos');
			}, function(){			
				self.stopMoving('left', $('.photos_inner'), 'photos');	
				self.moving = false;
			});
			
			// Photos right hover
			$('.photos_wrapper .right_over').hover(function(e){
				self.moving = true; 
				self.move('right', $('.photos_inner'), 'photos');
			}, function(){
				self.stopMoving('right', $('.photos_inner'), 'photos');
				self.moving = false;
			});

			// Photos li element positioning
			$('.photos_outer li').each(function(i) {
				$(this).css('left',photos_offset);
				photos_offset += 110;
			});
			$('.photos_outer li a').colorbox({transition:'elastic', speed:500});
			$('.photos_inner').css('width',photos_offset);			
		},
		
		/******************************************/
		// Calls recursively while mouse is in the hover area
		/******************************************/		
		move : function(direction, container, type)
		{	
			var self = this;
			
			if(self.moving){					
				var leftval = 0;
				var leftBound = 0;
				var rightBound = 0;
				
				if(direction == "right") {
						leftval = parseInt( container.css('left') ) - self.sf;
				} else {
						leftval = parseInt( container.css('left') ) + self.sf;
				}
				
				if(type == "photos") {
					leftBound = self.PHOTOS_LEFT_BOUND;
					rightBound = self.PHOTOS_RIGHT_BOUND;
				} else {
					leftBound = self.DISCS_LEFT_BOUND;
					rightBound = self.DISCS_RIGHT_BOUND;
				}
				
				self.sf += (self.sf/50); // simulates acceleration
				
				if( leftval > rightBound && leftval < leftBound ) { // If within acceptable bounds
					container.animate({ left: leftval }, (1000/24), function() { self.move( direction, container, type ); });
				} else {
					// Hitting the end of the row, bounce effect
					leftval = direction == "right" ? leftval + (self.sf * 2) : leftval - (self.sf * 2); // Bounce distance = speed factor * 2
					container.animate({ left: leftval }, 300, "easeOutBack");
					self.sf = 10; // Reset speed factor to eliminate accumulated acceleration
				}
			}
		},
		
		/******************************************/
		// Creates a visual effect of inertia
		/******************************************/
		stopMoving : function(direction, container, type)
		{
			var self = this;
			
			self.moving = false;
			var leftval = direction == 'right' ? parseInt(container.css('left'))-25 : parseInt(container.css('left'))+25;
			var leftBound = 0;
			var rightBound = 0;
			
			if(type == "photos") {
				leftBound = self.PHOTOS_LEFT_BOUND;
				rightBound = self.PHOTOS_RIGHT_BOUND;
			} else {
				leftBound = self.DISCS_LEFT_BOUND;
				rightBound = self.DISCS_RIGHT_BOUND;
			}	
			if( leftval > rightBound && leftval < leftBound ) {
				container.animate({ left: leftval }, 300, "easeOutSine");
			}
			self.sf = 10; // Reset speed factor to eliminate accumulated acceleration
		},
		
		/******************************************/
		// Initalize Discs display
		/******************************************/
		initDiscs : function()
		{		
			var self = this;
			var discs_offset = 0;
			
			$('.discs_inner').css('left', 0 ); // Initalize inner container			
			
			$('.discs_outer li').each(function(i) {
				$(this).css('left',discs_offset);
				discs_offset += 220;
			});
			$('.discs_inner').css('width',discs_offset);
		
			// Discs left hover
			$('.discs_wrapper .left_over').hover(function(e){
				self.moving = true; 
				self.move('left', $('.discs_inner'), "discs");
			}, function(){
				self.stopMoving('left', $('.discs_inner'), "discs");	
				self.moving = false;
			});
			
			// Discs right hover
			$('.discs_wrapper .right_over').hover(function(e){
				self.moving = true; 
				self.move('right', $('.discs_inner'), "discs");
			}, function(){
				self.stopMoving('right', $('.discs_inner'), "discs");
				self.moving = false;
			});
			
		},
		
		/******************************************/
		// Initalize Disc-specific page
		/******************************************/		
		initDiscPage: function()
		{
			var url = window.location.hash.substr(1, window.location.hash.length),
				self = this;
			
			$('ul.tracks li:odd').addClass('odd');

			$('ul.tracks li .play').each(function(i){

				$(this).bind('click', function(e){
					$(this).parent().siblings().find('.play').removeClass('pause').data('playing',false);
					$('ul#playlist li').removeClass('playlist_current');

					if($(this).data('playing'))
					{
						// Stop track
						$(this).data('playing',false)
							   .removeClass('pause');
						$("#jquery_jplayer").pause()
											.data('last_track', url.substr(12, url.length)+i); // Faciltates pausing
						$('#player_playpause').addClass('pause');
					} else {					
						self.playsource = "page";
						$(this).data('playing',true)
							   .addClass('pause');
						$('#player_playpause').removeClass('pause');

						if($('#jquery_jplayer').data('last_track') == (url.substr(12, url.length)+i))
						{	// If the previous track is the current, resume play
							$('#jquery_jplayer').play();
						} 
						else 
						{	// Otherwise, play the newly specified track
							switch(url.substr(12, url.length))
							{
								case 'nowhere':
									$("#jquery_jplayer").stop().setFile(samples.nowherePlaylist[i].mp3).play();
									break;
								case 'fromwithin':
									$("#jquery_jplayer").stop().setFile(samples.fromwithinPlaylist[i].mp3).play();
									break;
								case 'message':
									$("#jquery_jplayer").stop().setFile(samples.messagePlaylist[i].mp3).play();
									break;
								case 'riverstory':
									$("#jquery_jplayer").stop().setFile(samples.riverstoryPlaylist[i].mp3).play();
									break;
							}
						}
					}
				});


			});	 // end each
		},
		
		/******************************************/
		// Initalize Music Player
		/******************************************/
		initPlayer: function()
		{
			var self = this;
			
			$('ul#playlist').bind('mouseout', function(e){
				// Set to currently playing track
				$('ul#playlist li').removeClass('selected').end().eq(0).addClass('selected');
			});
			
			// Adapted playlist extension code from
			// http://www.happyworm.com/jquery/jplayer/0.2.5/demo-02.htm
			var playItem = 0;

			$("#jquery_jplayer").jPlayer({
				ready: function() {
					displayPlayList();
					playListInit(false); // Parameter is a boolean for autoplay.
				}
			})
			.jPlayerId("loadBar", "progress_load_bar")
			.jPlayerId("playBar", "progress_play_bar")
			.jPlayerId("volumeBarValue", "player_volume_bar_value")
			.onProgressChange( function(loadPercent, playedPercentRelative, playedPercentAbsolute, playedTime, totalTime) {
				var myPlayedTime = new Date(playedTime);
				var ptMin = (myPlayedTime.getUTCMinutes() < 10) ? "0" + myPlayedTime.getUTCMinutes() : myPlayedTime.getUTCMinutes();
				var ptSec = (myPlayedTime.getUTCSeconds() < 10) ? "0" + myPlayedTime.getUTCSeconds() : myPlayedTime.getUTCSeconds();
				$("#player_time_remaining").text(ptMin+":"+ptSec);

				var myTotalTime = new Date(totalTime);
				var ttMin = (myTotalTime.getUTCMinutes() < 10) ? "0" + myTotalTime.getUTCMinutes() : myTotalTime.getUTCMinutes();
				var ttSec = (myTotalTime.getUTCSeconds() < 10) ? "0" + myTotalTime.getUTCSeconds() : myTotalTime.getUTCSeconds();
				$("#total_time").text(ttMin+":"+ttSec);
			})
			.onSoundComplete( function() {
				if(self.playsource == "player")
				{
					playListNext();
				} else {
					$("#jquery_jplayer").stop();
					$('#player_playpause').addClass('pause');
					$('ul.tracks li').find('.play.pause').removeClass('pause');
				}		
			});

			$("#ctrl_prev").click( function() {
				playListPrev();
				return false;
			});

			$("#ctrl_next").click( function() {
				playListNext();
				return false;
			});
			
			// Volume toggle
			var mute = false;
			$('#player_volume_toggle').bind('click', function(e){
				e.preventDefault();
				if(mute){
					$(this).removeClass('mute');
					mute = false;
					$("#jquery_jplayer").volume(100);
				} else {
					$(this).addClass('mute');
					mute = true;
					$("#jquery_jplayer").volume(0);
				}
			});

			// Play toggle
			var playing = false;
			$('#player_playpause').addClass('pause').bind('click', function(e){
				e.preventDefault();
				if(playing){
					$("#jquery_jplayer").pause();
					$(this).addClass('pause');
					playing = false;
				} else {
					if($('ul#playlist li.playlist_current').length == 0 && self.playsource != "page") {
						$('ul#playlist li').eq(0).addClass('playlist_current');
					}
					$("#jquery_jplayer").play();
					$(this).removeClass('pause');
					playing = true;
				}
			});

			// Display contents of sidebar playlist
			function displayPlayList() {
				for (i=0; i < samples.sidebarPlaylist.length; i++) {
					$("ul#playlist").append("<li id='playlist_item_"+i+"'><strong>"+ samples.sidebarPlaylist[i].name +"</strong> from " + samples.sidebarPlaylist[i].album + "</li>");
					$("#playlist_item_"+i).data( "index", i ).hover(
						function() {
							$(this).addClass("playlist_hover");
						},
						function() {
							$(this).removeClass("playlist_hover");
						}
					).click( function() {
						var index = $(this).data("index");
						playListChange( index );
					});
				}
				$('ul#playlist li:odd').addClass('odd');
			}

			function playListInit(autoplay) {
				if(autoplay) {
					playListChange( playItem );
				} else {
					playListConfig( playItem );
				}
			}

			function playListConfig( index ) {
				if(playing) {
					$("#playlist_item_"+playItem).removeClass("playlist_current");
					$("#playlist_item_"+index).addClass("playlist_current");
				}
				playItem = index;
				$("#jquery_jplayer").setFile(samples.sidebarPlaylist[playItem].mp3, samples.sidebarPlaylist[playItem].ogg);
			}

			function playListChange( index ) {
				self.playsource = "player";
				$('ul.tracks li .play').removeClass('pause').data('playing',false);
				playing = true;
				playListConfig( index );
				$("#jquery_jplayer").play();
				$('#player_playpause').removeClass('pause');
			}

			function playListNext() {
				var index = (playItem+1 < samples.sidebarPlaylist.length) ? playItem+1 : 0;
				playListChange( index );
			}

			function playListPrev() {
				var index = (playItem-1 >= 0) ? playItem-1 : samples.sidebarPlaylist.length-1;
				playListChange( index );
			}
			
		}
		
	};
	
	
	$(function() {
		pp.init();
	});
	
})(jQuery);