$(document).ready(function() {
  if (list = $('#tracks')) BrikPlayer(list);
});

var BrikPlayer = function(list) {
  var play = function(i) {
    if (i < 0 || i > meta.playlistLength) {
      return false;
    }
    else {
      state.mode = 'playing';
      if (state.current !== null) {
        ui.anchors[state.current].removeClass('current');
        current().sound.stop();
        ui.progress.width(0);
        ui.loaded.width(0);
      }
      if (i === 0) {
        ui.controls.addClass('start');
        ui.controls.removeClass('end');
      }
      else if (i === meta.playlistLength) {
        ui.controls.addClass('end');
        ui.controls.removeClass('start');
      }
      else {
        ui.controls.removeClass('start');
        ui.controls.removeClass('end');
      }
      ui.controls.addClass('playing');
      state.current = i;
      ui.anchors[i].addClass('current');
      ui.title.html(current().name);
      if (current().loaded >= 100) {
        ui.loaded.width('100%');
      }
      // Finally play the track, making sure it's been reset before hand.
      current().sound.stop();
      current().sound.play();
      return true;
    }
  };

  var pause = function() {
    state.mode = 'paused';
    ui.controls.removeClass('playing');
    ui.title.html(meta.playlist[state.current].name + ' (paused)');
    meta.playlist[state.current].sound.pause();
  };

  var unpause = function() {
    state.mode = 'playing';
    ui.controls.addClass('playing');
    ui.title.html(meta.playlist[state.current].name);
    meta.playlist[state.current].sound.resume();
  };
  
  var finish = function() {
    if (!play(state.current + 1)) {
      ui.anchors[state.current].removeClass('current');
      state.current = null;
      state.mode = 'stopped';
      ui.controls.removeClass('playing');
      ui.controls.removeClass('end');
      ui.title.html('…');
      ui.progress.width(0);
      ui.loaded.width(0);
    }
  };

  var current = function() {
    return meta.playlist[state.current];
  };

  var loading = function() {
    current().loaded = (this.bytesLoaded / this.bytesTotal) * 100;
    ui.loaded.width(current().loaded + '%');
  };

  var playing = function() {
    state.played = (this.position / this.durationEstimate) * 100;
    ui.progress.width(state.played + '%');
  };

  var controlClick = function() {
    switch(this.className) {
      case 'back':
        if (state.current !== null) play(state.current - 1);
        break;
      case 'forward':
        state.current !== null ? play(state.current + 1) : play(0);
        break;
      case 'play':
        switch(state.mode) {
          case 'playing': 
            pause(); 
            break;
          case 'paused': 
            unpause(); 
            break;
          case 'stopped': 
            play(0);
            break;
        }
        break;
    }
  };
  
  var anchorClick = function() {
    play(meta.map[this]);
    return false;
  };

  var progressClick = function(e) {
    if (state.current !== null) {
      var offset = e.pageX - ui.progressContainer.offset().left;
      var percent = (offset / 390) * 100;
      if (current().loaded > percent) {
        var jump = (percent / current().loaded) * 100;
        var target = current().sound.durationEstimate * (jump / 100);
        current().sound.setPosition(target);
        if (state.mode === 'paused') {
          state.mode = 'playing';
          ui.controls.addClass('playing');
          ui.title.html(playlist[current].name);
        }
      }
    }
  };

  var state = {
    current: null,
    mode: 'stopped',
    loaded: 0
  };

  var meta = {
    playlist: [],
    platlistLength: 0,
    map: {}
  };

  var ui = {
    anchors: []
  };

  var anchorNodes = list.find('a');
  
  var load = function() {
    // Collect track info and attach events
    for (var i = 0; i < anchorNodes.length; i++) {
      var a = $(anchorNodes[i]);
      var sound = soundManager.createSound({
        id: 'track-' + i, 
        url: a.attr('href'),
        onfinish: finish,
        whileloading: loading,
        whileplaying: playing
      });
      meta.playlist.push({sound: sound, name: a.html()});
      meta.map[anchorNodes[i]] = i;
      a.click(anchorClick);
      ui.anchors.push(a);
    }

    meta.playlistLength = meta.playlist.length - 1;

    // Construct player interface
    ui.controls = $('<ul id="player" class="start"></ul>');
    ui.controls.insertBefore(list);
    ui.display = $('<li class="display"><strong>Playing: </strong></li>');
    ui.title = $('<span>…</span>');
    ui.display.append(ui.title);
    ui.controls.append(ui.display);

    ui.progressContainer = $('<li class="progress">&nbsp;</li>');
    ui.progressContainer.click(progressClick);
    ui.progress = $('<div class="head">&nbsp;</div>');
    ui.loaded = $('<div class="loaded">&nbsp;</div>');
    ui.progressContainer.append(ui.progress, ui.loaded);
    ui.controls.append(ui.progressContainer);

    var names = ['forward', 'play', 'back'];
    for (var i = 0; i < names.length; i++) {
      var button = $('<li class="' + names[i] + '">&nbsp;</li>');
      ui.controls.append(button);
      button.click(controlClick);
    }
  };
  
  // Configure sound manager
  soundManager.url = '/flash/';
  soundManager.useFlashBlock = false;
  soundManager.onload = load;
  soundManager.useConsole = false;
  soundManager.debugMode = false;
};


