

globalPlayerId = 'global_player';


// global html audio player vars
var audioPlayerVars = {
        currentPosition: 0,
        currentDuration: false,
        currentSongIndex: false,
        currentItem: -1,
        playlistElementId: false,
        player: false,
        loaded: false,
        trackRecent: false
    };


soundManager.url = '/_swf/'; // directory where SM2 .SWFs live

soundManager.debugMode = false;


whileloading = function ()
{    
	//soundManager._writeDebug('sound '+this.sID+' loading, '+this.bytesLoaded+' of '+this.bytesTotal);	
	
	audioPlayerVars.currentLoaded = this.bytesLoaded; 
	audioPlayerVars.currentTotal  = this.bytesTotal;

	var loadedPercentage =  percentComplete(audioPlayerVars.currentLoaded, audioPlayerVars.currentTotal);
	var totalLoaded      =  $('#' + audioPlayerVars.playlistElementId + ' .loaded_progress');

	totalLoaded.width(loadedPercentage + '%');
	$('#' + globalPlayerId + ' .loaded_progress').width(loadedPercentage + '%');
	  
};

whileplaying = function ()
{    
    audioPlayerVars.currentPosition = (this.position / 1000); 
    
    if (this.bytesLoaded == this.bytesTotal)
    {
        audioPlayerVars.currentDuration = (this.duration / 1000);
    }
    else
    {
        audioPlayerVars.currentDuration = (this.durationEstimate / 1000);
    }
        
    var playedPercentage =  percentComplete(audioPlayerVars.currentPosition, audioPlayerVars.currentDuration); 
    
    
    // make it so 96%+ is 100%
    if (playedPercentage > 96) { playedPercentage = 96;}   
        
    // progress bar
    if ($('#' + audioPlayerVars.playlistElementId + ' .played_progress').length > 0)
    {   
        $('#' + audioPlayerVars.playlistElementId + ' .played_progress').width(playedPercentage + '%');
    }   
    
    // progress bar global
    if ($('#' + globalPlayerId + ' .played_progress').length > 0)
    {
		$('#' + globalPlayerId + ' .played_progress').width(playedPercentage + '%');
    }
    
    // time display
    if ($('#' + audioPlayerVars.playlistElementId + ' .time_elapsed').length > 0)
    {    
        $('#' + audioPlayerVars.playlistElementId + ' .time_elapsed').html(formatTime(audioPlayerVars.currentPosition));
    }
    
    // time display global
    if ($('#' + globalPlayerId + ' .time_elapsed').length > 0)
    {
    	$('#' + globalPlayerId + ' .time_elapsed').html(formatTime(audioPlayerVars.currentPosition));
    }
    
    // track recent listen
    if (audioPlayerVars.currentPosition >= 45 && audioPlayerVars.trackRecent == false)
    {
    	$.get('/_controller/playlist.php', {
        field: 'song',
        value: audioPlayerVars.currentItem,
        action: 'trackRecent'
       });
       
       audioPlayerVars.trackRecent = true;
    }
};

soundManager.onload = function() 
{    
	audioPlayerVars.loaded = true;
};



onfinish = function ()
{
    selectNextSong();
};

soundManager.defaultOptions = {
  autoLoad: false,      // enable automatic loading (otherwise .load() will call with .play())
  autoPlay: false,      // enable playing of file ASAP (much faster if "stream" is true)
  multiShot: false,      // let sounds "restart" or "chorus" when played multiple times..
  onid3: null,          // callback function for "ID3 data is added/available"
  onload: null,         // callback function for "load finished"
  onstop: null,         // callback for "user stop"
  onfinish: onfinish,       // callback function for "sound finished playing"
  onbeforefinish: null, // callback for "before sound finished playing (at [time])"
  onbeforefinishtime: 5000,    // offset (milliseconds) from sound end, call beforefinish..
  onbeforefinishcomplete: null,// function to call when said sound finishes playing
  onjustbeforefinish: null,    // callback for [n] msec before end of current sound
  onjustbeforefinishtime: 200, // if unused, set to 0 (or null handler), event will not fire.
  onpause: null,        // callback for "pause"
  onplay: null,         // callback for "play" start
  onresume: null,       // callback for "resume" (pause toggle)
  position: null,       // offset (milliseconds) to seek to within downloaded sound.
  pan: 0,               // "pan" settings, left-to-right, -100 to 100
  stream: true,         // allows playing before entire file has loaded (recommended)
  volume: 70,          // self-explanatory. 0-100, the latter being the max.
  whileloading: whileloading,   // callback function for updating progress (X of Y bytes received)
  whileplaying: whileplaying,   // callback during play (position update)
  isMovieStar: null,    // "MovieStar" MPEG4 audio/video mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
  usePeakData: false,   // enable left/right channel peak (level) data
  useWaveformData:false,// enable sound spectrum (raw waveform data) - WARNING: May set CPUs on fire.
  useEQData: false,     // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
  onmetadata: null,     // callback for when video width/height etc. are received
  useVideo: false       // if loading movieStar content, whether to show video
};


function selectCurrentSong(elementId)
{
    if (audioPlayerVars.currentItem < 1 || elementId != audioPlayerVars.playlistElementId)
    {       
    	var $first_song = $('#' + elementId + ' a.track_name:first');
    	
    	// no song found, maybe button player
    	if ($first_song.length == 0)
    	{
    		$first_song = $('div.button_player #' + elementId + ' a.play_pause_button');
    	}
    
        $first_song.click();
    }
    else
    {       
    	var $song = $('#' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem + ' a.track_name');    	
    	
    	// maybe button player
    	if ($song.length == 0)
    	{
			$song = $('div.button_player #' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem + ' a.play_pause_button');
    	}

        $song.click();
    }
    
    return true;
};

function selectNextSong(elementId)
{
    if (elementId !== undefined && elementId != audioPlayerVars.playlistElementId)
    {
        return selectCurrentSong(elementId);
    }

	var old = audioPlayerVars.currentItem;

    if ($('#' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem).next().length > 0)
    {
        $('#' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem).next().find('a.track_name').click();
    }
    
    //console.log("current: #song_" + old + " next: #song_" + audioPlayerVars.currentItem);
};

function selectPrevSong(elementId)
{
    if (elementId != audioPlayerVars.playlistElementId)
    {        
        return selectCurrentSong(elementId);
    }

    if ($('#' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem).prev().length > 0)
    {        
        $('#' + audioPlayerVars.playlistElementId + ' #song_' + audioPlayerVars.currentItem).prev().find('a.track_name').click();
    }
};

// ALL Players
soundManager.onerror = function() 
{
    soundManager.reboot();
};


function clearPreviousSong()
{
    // stop all songs
    soundManager.stopAll();
    
    if (audioPlayerVars.currentItem != -1)
    {
        //alert(audioPlayerVars.player.sID +  ' ' +  audioPlayerVars.player.bytesTotal);
    
        soundManager.destroySound(audioPlayerVars.currentItem); 
        
        //console.log('destroySound: ' + audioPlayerVars.currentItem);
    }
    

    // reset all variables
    audioPlayerVars.currentItem       = -1;
    audioPlayerVars.playlistElementId = false;
    audioPlayerVars.currentPosition   = 0; 
    audioPlayerVars.currentDuration   = false;
    audioPlayerVars.player            = false;
    audioPlayerVars.trackRecent       = false;
    
    // reset all icons
    $('.paused').removeClass('paused');
    $('.pause_button').removeClass('pause_button').addClass('play_button');
    
    $('.playlist_pause_button').removeClass('playlist_pause_button');
    
    $('.loaded_progress').width('0');
    $('.played_progress').width('0');
    $('.time_elapsed').html('0:00');

};

function waitForLoaded(js)
{
    if (audioPlayerVars.loaded == true)
    {
        return true;
    }

    else
    {    
        // wait a second
        setTimeout(js, 1000);
        
        return false;
    }
};


function getMoreTracks(id, userType, userId, type, extra)
{		
	if ($('#playlist_container_' + id + ' div.more_results').html() == 'yes')
	{		
		canScroll = false;
		
		// first time we are loading playlist
		if ($('#playlist_container_' + id + ' div.offset').html() == 0)
		{
			$('.playlist_container').addClass('playlist_loading');
		}
		
		// more tracks
		else
		{
			$('.loading_more_songs').show();
		}
		
		 $.get("/_controller/playlist.php",{
		   userType: userType,
		   userId: userId,
		   type: type,
		   extra: extra,
		   offset: $('#playlist_container_' + id + ' div.offset').html(),
		   moduleId: $('#playlist_container_' + id).parents('div.player_wrapper').attr('id'),
		   amount: $('#playlist_container_' + id + ' div.amount').html(),
		   zIndex: $('#playlist_container_' + id + ' div.zIndex').html(),
		   action: "getMoreTracks",
		   options: $.toJSON($('#playlist_container_' + id + ' div.options').html())
		 }, function(xml) {
		       
		       var $playlistContainer = $('#playlist_container_' + id);
		       var oldOffset = $('#playlist_container_' + id + ' div.offset').html(); 
		               
		       if ($("status",xml).text() == 'success')
		       {			       
		       		$playlistContainer.find('div.offset').html($("offset",xml).text());
		       		$playlistContainer.find('div.zIndex').html($("zIndex",xml).text());
		       					       		
		       		if ($("playlist_items",xml).text() == '')
		       		{
		       			$playlistContainer.find('div.more_results').html('no');
		       		}
		       		else
		       		{		
		       			var hasTracks = $('.playlist_item:first').length;
		       		       		
			       		$playlistContainer.append($("playlist_items",xml).text());
			       		
			       		// set the global player with the first track
			       		if (hasTracks == 0)
			       		{
			       			updateGlobalPlayer($playlistContainer.find('.playlist_item:first'), false);
			       		}
			       	}
		       }
		      
		       else
		       {    
		            // error
		            alert($("message",xml).text());
		       }
		       
		       if (oldOffset == 0)
		       {
		       		playlistLoaded();		       		
		       		updatePlayerMetaContainer($playlistContainer.find('.playlist_item:first'));
		       }
		       else
		       {
			       	$('.loading_more_songs').hide()
		       }
		       
		       canScroll = true;
		       $playlistContainer.find('.playlist_item').toggle();
		       //$playlistContainer.show();
			   $playlistContainer.find('.playlist_item').show();
		       
		       playlistItemMenuClick();
		       processPlaylistSongs();

		    }
		);
	}		
}



function updateGlobalPlayer($song_element, display)
{
	var $global_player = $('#' + globalPlayerId);
		
	// if no global player, skip			
	if ($global_player.length < 1)
	{
		return false;
	}
	
	var songName   = $song_element.find('.track_meta_song_name').html();
	var albumName  = $song_element.find('.track_meta_album_name').html();
	var albumImage = $song_element.find('.track_meta_album_image').html();
	var albumLink  = $song_element.find('.track_meta_album_link').html();
	var artistLink = $song_element.find('.track_meta_artist_link').html();
	var artistName = $song_element.find('.track_meta_artist_name').html();
	
	var $track_meta_container = $global_player.find('.track_meta_container');
	
	if (display === true)
	{	
		// show that we are playing the current song
		$global_player.find('.play_pause_button').removeClass('play_button').addClass('pause_button');
		$global_player.addClass('waiting_progress');
		$track_meta_container.show();
	}
	
    $track_meta_container.find('.track_meta_album_link').attr('href', albumLink);
    $track_meta_container.find('.track_meta_album_image').attr('src', albumImage);
    $track_meta_container.find('.track_meta_artist_name').html(artistName);
    $track_meta_container.find('.track_meta_artist_name').attr('href', artistLink);
    $track_meta_container.find('.track_meta_album_name').html(albumName);
    $track_meta_container.find('.track_meta_album_name').attr('href', albumLink);
    $track_meta_container.find('.track_meta_song_name').html(songName);
    $track_meta_container.find('.track_meta_song_name').attr('href', artistLink)

	var $first_track    = $song_element.find('a.track_name');
	
	// no track found, maybe button player?
	if ($first_track.length == 0)
	{
		$first_track = $song_element.find('a.play_pause_button');
	}
				
	if ($first_track.length != 0)
	{
		var $global_prev    = $global_player.find('.prev_button');
		var $global_current = $global_player.find('.play_pause_button');
		var $global_next    = $global_player.find('.next_button');
		
		// change the prev control to work with the current playlist
		$global_prev.unbind('click');
		$global_prev.click(function(){
			selectPrevSong($first_track.parents('div.player_wrapper').attr('id')); 
		});
		
		// change the play button to work with the current playlist
		$global_current.unbind('click');
		$global_current.click(function(){
			selectCurrentSong($first_track.parents('div.player_wrapper').attr('id')); 
		});
		
		// change the next button to work with the current playlist
		$global_next.unbind('click');
		$global_next.click(function(){
			selectNextSong($first_track.parents('div.player_wrapper').attr('id')); 
		});
	}
}


function updatePlayerMetaContainer($playlistItem)
{	
	var songName   = $playlistItem.find('.track_meta_song_name').html();
	var albumName  = $playlistItem.find('.track_meta_album_name').html();
	var albumImage = $playlistItem.find('.track_meta_album_image').html();
	var albumLink  = $playlistItem.find('.track_meta_album_link').html();
	var artistLink = $playlistItem.find('.track_meta_artist_link').html();
	var artistName = $playlistItem.find('.track_meta_artist_name').html();
	
	var $track_meta_container = $playlistItem.parents('.player_wrapper').find('.track_meta_container');
	
	//console.log('id is ' + $playlistItem.attr('id'));
	
		
	if ($track_meta_container.length > 0)
	{
        $track_meta_container.find('.track_meta_album_link').attr('href', albumLink);
        $track_meta_container.find('.track_meta_album_image').attr('src', albumImage);
        $track_meta_container.find('.track_meta_artist_name').html(artistName);
        $track_meta_container.find('.track_meta_artist_link').attr('href', artistLink);
        $track_meta_container.find('.track_meta_album_name').html(albumName);
        $track_meta_container.find('.track_meta_song_name').html(songName);
        
        $track_meta_container.show();
	}
}



// make sure element X is compeletly visible
function showCompletely($element)
{
	var i = 2;

	var $jScrollPane = $element.parents('.jScrollPaneContainer');

	// if we have scrolling
	if ($jScrollPane.length > 0)
	{		
		while (i > 1)
		{
			var noChange = true;
					
			// get locations of the currently playing track as well as the viewable playlist
			var trackOffsetTop       = $element.offset().top;
		    var trackOffsetBottom    = trackOffsetTop + $element.height();
		    var playlistOffsetTop    = $jScrollPane.offset().top;
			var playlistOffsetBottom = playlistOffsetTop + $jScrollPane.height();  
		      
		    // scroll up the playlist if song being played is above the visble tracks
		    if (trackOffsetTop < playlistOffsetTop)
		    {
		    	//console.log('playlist should move up');
		    	$('.jScrollArrowUp').mousedown();
		    	$('.jScrollArrowUp').mouseup();
		    	
		    	noChange = false;
		    }
		    
		    // scroll down the playlist if song being played is below the visible tracks
		    if (trackOffsetBottom > playlistOffsetBottom)
		    {
		    	//console.log('playlist should move down');
		    	$('.jScrollArrowDown').mousedown();
		    	$('.jScrollArrowDown').mouseup();
		    	
		    	noChange = false;
		    }
		    
		    // exit once we can see the element
		    if (noChange == true)
		    {
		    	break;
		    }
		}
	}
};



// choose song to play
function selectSong(id, elementId)
{    
    var js = "selectSong('" + id + "', '" + elementId + "');";
    
    if (waitForLoaded(js) == false)
    {
        return false;
    }


	//console.log('current playing song: ' + audioPlayerVars.currentItem + ' next song is ' + id);

    // if we have a new song, instaniate it
    if (audioPlayerVars.currentItem != id)
    {    
        clearPreviousSong();
    
        audioPlayerVars.currentItem       = id;
        audioPlayerVars.playlistElementId = elementId;
        
        var $currentPlaylist     = $('#' + audioPlayerVars.playlistElementId);
        var $currentPlaylistItem = $currentPlaylist.find('#song_' + id);
        var $currentPlaylistMeta = $currentPlaylist.find('.track_meta_container');
        
        //console.log('cp: ' + $currentPlaylist.attr('id') + '  cpi: ' + '#song_' + id);
        
        //console.log(' cp is #' + audioPlayerVars.playlistElementId);
        
        //console.log('createSound: ' + audioPlayerVars.currentItem);
                
        soundManager.createSound({id: audioPlayerVars.currentItem});
            
        audioPlayerVars.player = soundManager.getSoundById(id);
                
        soundManager.authorizeSong(id, false);
                
        $currentPlaylistItem.show();
        
                
        // if we have scrolling
        showCompletely($currentPlaylistItem);
                
        $('div.button_player div.waiting_progress').removeClass('waiting_progress');        
        
        $currentPlaylist.addClass('waiting_progress');        
        $currentPlaylist.find('.play_pause_button').removeClass('play_button').addClass('pause_button');
        
        $currentPlaylistItem.find('.playlist_play_button').addClass('playlist_pause_button');
        
        updatePlayerMetaContainer($currentPlaylistItem);        
        updateGlobalPlayer($currentPlaylistItem, true);
    }
    
    // if this is the current song, toggle play / pause
    else
    {
    	var $globalPlayer        = $('#' + globalPlayerId);
    	var $currentPlaylist     = $('#' + audioPlayerVars.playlistElementId);
        var $currentPlaylistItem = $currentPlaylist.find('#song_' + id);
        var $currentPlaylistMeta = $currentPlaylist.find('.track_meta_container')
    
    
        if (audioPlayerVars.player.readyState != 1 && audioPlayerVars.player.readyState != 3)
        {
           return false;
        }
    
        else if (audioPlayerVars.player.paused) 
    	{     			
            $currentPlaylist.find('.play_pause_button').removeClass('play_button').addClass('pause_button');
            $currentPlaylistItem.find('.playlist_play_button').addClass('playlist_pause_button');
            
            if ($globalPlayer.length > 0)
            {
            	$globalPlayer.find('.play_pause_button').removeClass('play_button').addClass('pause_button');
            }     
    	}
    	else
    	{
            $currentPlaylist.find('.play_pause_button').removeClass('pause_button').addClass('play_button');		
            $currentPlaylist.find('.playlist_play_button').removeClass('playlist_pause_button');
            
            if ($globalPlayer.length > 0)
            {
            	$globalPlayer.find('.play_pause_button').removeClass('pause_button').addClass('play_button');
            }
    	}
   
        audioPlayerVars.player.togglePause();
    }
};


// skip to the part of the song the user has selected
function seek(event)
{
    //console.log('seek');

    if (audioPlayerVars.currentDuration == false)
    {
        return false;
    }

	// if the clicked div is a child
	if ($(event.target).hasClass('total_progress') == false)
	{
		total_progress_div = $(event.target).parent('.total_progress');
	}
	else
	{
		total_progress_div = $(event.target);
	}

	
    var totalWidth = total_progress_div.width();
    var containerX = total_progress_div.offset().left;
    var percentage = (event.pageX - containerX) / totalWidth;

	//console.log('event pageX ' + event.pageX + ' containerX: ' + containerX + ' precentage ' + percentage + ' width ' + totalWidth + ' id ' + total_progress_div.attr('id'));

    var position   = audioPlayerVars.currentDuration * 1000 * percentage;
	
	  

    //console.log('x: ' + x + ' currentDuration: ' + currentDuration + ' percentage: ' + percentage);

    audioPlayerVars.player.setPosition(position); 
};


// change the audio level
function volume_control(event)
{
    //console.log('volume');

	// if the clicked div is a child
	if ($(event.target).hasClass('volume_meter_bg') == false)
	{
		volume_meter_div = $(event.target).parent('.volume_meter_bg');
	}
	else
	{
		volume_meter_div = $(event.target);
	}

	
    var totalWidth = volume_meter_div.width();
    var containerX = volume_meter_div.offset().left;
    var percentage = (event.pageX - containerX) / totalWidth;

	//console.log('event pageX ' + event.pageX + ' containerX: ' + containerX + ' precentage ' + percentage + ' width ' + totalWidth + ' id ' + volume_meter_div.attr('id'));

    var position = 100 * percentage;

	//console.log('volume level is ' + position);

    audioPlayerVars.player.setVolume(position);
    soundManager.defaultOptions.volume = position;
    
    volume_meter_div.find('.volume_meter').width(position + '%');
    
    
    $.post('/_webcode/user_settings.php', {
        field: 'volume',
        value: position,
        action: 'update'
       });
};





// calculate the percentage we've gone through
function percentComplete(position, duration)
{
    return (position / duration) * 100;
};



function playSong(id, newUrl)
{
    //alert('trying to play id: ' + id + ' url: ' + newUrl);

	// play & override sound object with new URL
	audioPlayerVars.player.play({id: id, url: newUrl});	
};


function formatTime(time)
{
	var sec = Math.round(time % 60);

	if (sec < 10)
	{
		sec = "0" + sec;
	}
	
	var min = Math.floor(time / 60);

	return min + ":" + sec;
};

// show next X results in the playlist
function showNext(elementIdentifier, amount, viewMoreLink)
{	
	amount = $(elementIdentifier + ':visible').length + amount;
	
	$(elementIdentifier + ':lt(' + amount + ')').show();
		
	// if no more results, hide the View More button
	if ($(elementIdentifier + ':hidden').length < 1)
	{
		$(viewMoreLink).hide();
	}
};