$(document).ready( function() {
  
  $('div#NextTrack a').click( function() {
    return advance_track( 1 );
  });

  $('div#PrevTrack a').click( function() {
    return advance_track( -1 );
  });
  
  $('div#PlayPause').click( function() {
    if ( $('div#Album').is('.paused') ) {
      resume_playback();
    } else {
      pause_playback();
    }
    return false;
  });

  if ( $.browser.mozilla ) {
    $('form#Volume').hide();
  }
  
  $('input#VolumeControl').change( function() {
    var volume_level = parseInt($('input#VolumeControl').val());
    if ( volume_level == 0 ) { $(this).parents('form')[0].className = 'volume_mute'; }
    else if ( volume_level < 8 ) { $(this).parents('form')[0].className = 'volume_1'; }
    else if ( volume_level < 16 ) { $(this).parents('form')[0].className = 'volume_2'; }
    else { $(this).parents('form')[0].className = 'volume_3'; }
    set_volume( volume_level / 20 );
    set_commentary_volume( volume_level / 20 );
  });
  
  $('a.why').click( function() {
    play_commentary();
    return false;
  });
  
  precache_images();
  window.setTimeout(load_tracks, 500);
  
});

function precache_images() {
  var a = new Image;
  var b = new Image;
  var c = new Image;
  var d = new Image;
  var e = new Image;
  a.src = 'img/pause-hover.png';
  b.src = 'img/volume-0.png';
  c.src = 'img/volume-1.png';
  d.src = 'img/volume-2.png';
  e.src = 'img/volume-3.png';
}

function advance_track( tracks ) {
  var current_track_id = $('div#Album ul li.current_track').prevAll('li').length;
  return go_to_track( current_track_id + tracks );
}

function go_to_track( new_track_id ) {
  // If there currently is a next track, return
  if ( $('.next_track').length > 0 ) { return false; }

  // Keep track numbers within bounds
  new_track_id = new_track_id % ( $('div#Album ul li').length );

  // Return if we are currently playing that track
  var current_track_id = $('div#Album ul li.current_track').prevAll('li').length;
  if ( current_track_id == new_track_id ) { return false; }
  
  // Find current track and next track
  var cur_track = $('div#Album ul li.current_track');
  var next_track = cur_track.parents('ul').children('li').eq( new_track_id );
  next_track.addClass('next_track');
  next_track.show();
  
  // Pre-hide content on next track
  next_track.find('h2, a.why').hide();
  
  // Animate
  seek_current_track(0);
  stop_commentary();
  if ( cur_track.find('a.why').length > 0 ) {
    cur_track.find('a.why').fadeOut(200, function() {
      cur_track.find('h2').fadeOut(400, function() {
        cur_track.fadeOut(1000, function() {
          var jq_obj = $('.next_track');
          $('.current_track').removeClass('current_track');
          jq_obj.addClass('current_track');
          jq_obj.removeClass('next_track');
          play_current_track();
          jq_obj.find('h2').fadeIn(400, function() {
            $('.current_track a.why').fadeIn(200);
          });
        });
      });
    });
  } else {
    cur_track.find('h2').fadeOut(400, function() {
      cur_track.fadeOut(1000, function() {
        var jq_obj = $('.next_track');
        $('.current_track').removeClass('current_track');
        jq_obj.addClass('current_track');
        jq_obj.removeClass('next_track');
        play_current_track();
        jq_obj.find('h2').fadeIn(400, function() {
          $('.current_track a.why').fadeIn(200);
        });
      });
    });
  }
  
  // GTFO
  return false;
}

function resume_playback() {
  $('div#Album').removeClass('paused');
  $('div#Album').addClass('playing');
  play_current_track();
}

function pause_playback() {
  $('div#Album').removeClass('playing');
  $('div#Album').addClass('paused');
  pause_current_track();
}

function pause_current_track() {
  if ( currently_playing_track_id != -1 ) {
    tracks[ currently_playing_track_id ].pause();
  }
}

function mute_current_track() {
  if ( currently_playing_track_id != -1 ) {
    tracks[ currently_playing_track_id ].volume = 0;
  }
}

function set_volume( volume_level ) {
  if ( currently_playing_track_id != -1 ) {
    tracks[ currently_playing_track_id ].volume = volume_level * volume_multiplier;
  }
}

function set_commentary_volume( volume_level ) {
  if ( $('div#Album ul li.current_track a.why').length > 0 ) {
    commentary[ currently_playing_track_id ].volume = volume_level;
  }
}

function play_current_track() {
  currently_playing_track_id = $('div#Album ul li.current_track').prevAll('li').length;
  if ( $('div#Album').is('.playing') ) {
    set_volume( parseInt($('input#VolumeControl').val()) / 20 );
    tracks[ currently_playing_track_id ].play();
  }
}

function seek_current_track( position ) {
  if ( ( currently_playing_track_id != -1 ) && ( track_loaded[ currently_playing_track_id ] ) ) {
    mute_current_track();
    tracks[ currently_playing_track_id ].addEventListener("seeked", volume_save_func, true);  
    tracks[ currently_playing_track_id ].currentTime = position;
  }
}

var volume_save_func = function() {
  this.pause();
  this.volume = (parseInt($('input#VolumeControl').val()) / 20 ) * volume_multiplier;
  this.removeEventListener("seeked", volume_save_func, true);
};


function play_commentary() {
  if ( $('div#Album ul li.current_track a.why').length > 0 ) {
    set_commentary_volume( parseInt($('input#VolumeControl').val()) / 20 );
    duck_current_track();
    commentary[ currently_playing_track_id ].play();
  }
}

function stop_commentary() {
  if ( ( currently_playing_track_id != -1  ) && ( $('div#Album ul li.current_track a.why').length > 0 ) ) {
    commentary[ currently_playing_track_id ].pause();
    if ( commentary_loaded[ currently_playing_track_id ] ) {
      commentary[ currently_playing_track_id ].currentTime = 0;
    }
    emergency_unduck();
  }
}

function duck_current_track() {
  window.clearInterval( ducker_func );
  ducker_func = window.setInterval( ducker, 50, volume_multiplier, 0.1);
}

function unduck_current_track() {
  window.clearInterval( ducker_func );
  ducker_func = window.setInterval( ducker, 50, volume_multiplier, 1);
}

function emergency_unduck() {
  window.clearInterval( ducker_func );
  volume_multiplier = 1;
}

function ducker( start_volume_multiplier, target_volume_multiplier ) {
  var growing = target_volume_multiplier > start_volume_multiplier;
  var shrinking = target_volume_multiplier < start_volume_multiplier;
  volume_multiplier += ( target_volume_multiplier - start_volume_multiplier ) / 10;
  if ( ( volume_multiplier == target_volume_multiplier ) || ( growing && ( volume_multiplier > target_volume_multiplier ) ) || ( shrinking && ( volume_multiplier < target_volume_multiplier ) ) ) {
    window.clearInterval(ducker_func);
    volume_multiplier = target_volume_multiplier;
  }
  set_volume( parseInt($('input#VolumeControl').val()) / 20 );
}

var tracks = [];
var track_loaded = []
var currently_playing_track_id = -1;

var commentary = [];
var commentary_loaded = [];
var volume_multiplier = 1;
var ducker_func;

function load_tracks() {

  $('div#Album ul li').each( function(i) {
    var href = $(this).find('a.song_audio').attr('href');
    
    // Use OGG for Firefox
    if ( $.browser.mozilla ) {
      href = href.replace(".mp3", ".ogg");
    }
    tracks[i] = document.createElement('audio');
    tracks[i].setAttribute('src', href);
    $(this).append('<div class="loading_indicator"><span>Loading music</span></div>');
    tracks[i].addEventListener("ended", function() { advance_track(1); }, true);  
    track_loaded[i] = false;
    tracks[i].addEventListener("canplaythrough", function() {
      var jq_obj = $('div#Album ul li').eq( i ).find('div.loading_indicator');
      jq_obj.html('<span>Playing</span>');
      jq_obj.fadeOut('200', function() { $(this).remove(); } );
      track_loaded[i] = true;
    }, true);
    
    commentary_loaded[i] = false;
    var commentary_link = $(this).find('a.why');
    if ( commentary_link.length > 0 ) {
      commentary[i] = document.createElement('audio');

      // Use OGG for Firefox
      if ( $.browser.mozilla ) {
        commentary[i].setAttribute('src', commentary_link.attr('href').replace(".mp3", ".ogg") );
      } else {
        commentary[i].setAttribute('src', commentary_link.attr('href') );
      }
      commentary[i].addEventListener("ended", function() { unduck_current_track(); }, true);  
      commentary[i].addEventListener("canplaythrough", function() {
        commentary_loaded[i] = true;
      }, true);
    }
  });
}