soundManager.defaultOptions.volume = 80;
soundManager.debugMode = false;
soundManager.url = '/m/swf/';

/* true if player is in minimized state */
var minimized;

var arrowdown = '<img src="/m/images/triangle.gif"/>';

/* if true loads the first track associated with a play button in the page */
var setup_with_first = false;

/* internal state variable. true if soundmanager has loaded the first
track found in the page */
var setup_playlist_done = false;

function createSlider() {
      $("#time_slider").slider({ start: function(event, ui) {
                                 var ct = currentTrack();
                                 if (ct) {
                                   currentTrack().pause();
                                 }
                               },

                               change: function(event, ui) {
                                 currentTrack().pause();
                                 currentTrack().setPosition($("#time_slider").slider('option', 'value'));
                                 /* hack: fix slider position */
                                 var handler = $('#time_slider a.ui-slider-handle');
                                 var newpos = parseInt(handler.css('left')) - 1 + '%';
                                 handler.css({left: newpos});
                               }});
    $("#vol_slider").slider( { change: function(event, ui) {
                                 currentTrack().setVolume($("#vol_slider").slider('option', 'value'));}});
};


function activate_player() {
  $('#player_container').show();
  if (!$('body').hasClass('playing')) {
    $('body').addClass('playing');
  }
  convert_links();
}

$(document).ready(
  function () {
    $('#player_container').hide();

    if ($('body').hasClass('playing')) {
      convert_links();
    }

    function on_play_event(e) {
                       e.preventDefault();
                       activate_player();
                       var album_id = $(this).children('.album_id').text();
                       var track_index = $(this).children('.track_index').text();
                       if ($(this).hasClass('need_login')) {
                             document.location.href = $('#need_login_url').text() + '?action=play';
                       } else {
                         if (soundManager.album_id + '' == album_id && soundManager.track_index + '' == track_index ) {
                           if (currentTrack().playState && !currentTrack().paused) {
                             $(this).removeClass('play_button_execution');
                             currentTrack().pause();
                             return;
                           };
                         };
                         $.ajax({
                           url: $(this).children('.load_album_url').text(),
                           success: function() { loadSong2(album_id, track_index, true); }
                                });
                         }
    }

    $(".play_all_tracks").live('click', on_play_event);
    $(".playBtn").live('click', on_play_event);

    /* player toggle bindings */
    $("#player_playlist_header .player_toggle").live('click', function (e) {
                                e.preventDefault();
                                togglePlayer();
                              });
    $("#player_controls .player_toggle").live('click', function (e) {
                                e.preventDefault();
                                togglePlayer();
                              });

    /* volume bindings */
    $("#volume_off").live('click', function(e) {
                             e.preventDefault();
                             soundManager.mute();
                           });
    $("#volume_on").live('click', function(e) {
                             e.preventDefault();
                             soundManager.unmute();
                           });

    /* like binding */
    $(".player_add_favourite_button_on").live('click', function (e) {
                                              e.preventDefault();
                                              $.ajax(
                                                { url: "/k/album/" + soundManager.album_id + '/favourite',
                                                cache: false,
                                                success : function (data,textStatus) {
                                                  $(".player_add_favourite_button_on").hide();
                                                  $(".player_remove_favourite_button_on").show();
//                                                  $('#fav_msg').text(data.message).oneTime('10s', function() { $(this).text(''); });
                                                  busker_alert(data.message, 'success');
                                                },
                                                dataType: "json"
                                                });
                                            });
    $(".player_remove_favourite_button_on").live('click', function (e) {
                                                   e.preventDefault();
                                                   $.ajax(
                                                     { url: "/k/album/" + soundManager.album_id + '/unfavourite',
                                                     cache: false,
                                                   success : function (data,textStatus) {
                                                     $(".player_remove_favourite_button_on").hide();
                                                     $(".player_add_favourite_button_on").show();
//                                                     $('#fav_msg').text(data.message).oneTime('10s', function() { $(this).text(''); });
                                                     busker_alert(data.message, 'success');
                                                     },
                                                     dataType: "json"
                                                     });
                                                 });

    createSlider();

    /*  previous song binding */
    $(".prev_song_button").live('click', function(e) {
                                   e.preventDefault();
                                   indicatorShow();
                                   $.ajax(
                                     { url: '/f/music/playlist/prev/',
                                     cache: false,
                                     success : function (data,textStatus) {
                                       var autoplay = true;
                                       if (data.album_id) {
                                         loadSong2(data.album_id, data.index, autoplay, data);
                                       } else {
                                       /* if no tracks are available
                                        * just reset the current song */
                                         indicatorHide();
                                         resetPosition();
                                         currentTrack().pause();
                                        /* hack: fix the slider position */
                                         var handler = $('#time_slider a.ui-slider-handle');
                                         var newpos = parseInt(handler.css('left')) - 1 + '%';
                                         handler.css({left: newpos});
                                       }
                                     },
                                     dataType: "json"
                                     });
                                 });
    /*  play song binding */
    $(".player_play_button").live('click', function(e) {
                                     e.preventDefault();
                            var ct = currentTrack();
                            if (ct) {
                              if (!ct.loaded) {
                                indicatorShow();
                                ct.load();
                                return;
                              }
                              if(ct.position > 0) {
                                currentTrack().resume();
                              } else {
                                currentTrack().start();
                              }
                            } else {
                              busker_alert('No Track loaded');
                            }
                          });
    /*  stop song binding */
    $(".stop_button").live('click', function(e) {
                            e.preventDefault();
                            var ct = currentTrack();
                            if (ct) {
                              currentTrack().pause();
                            } else {
                              busker_alert('No Track loaded');
                            }
                          });
    /*  forward song binding */
    next_song = function(autoplay) {
      indicatorShow();
      $.ajax(
        { url: '/f/music/playlist/next/',
        cache: false,
          success : function (data,textStatus) {
            if (data.album_id) {
              loadSong2(data.album_id, data.index, autoplay, data);
            } else {
              /* if no tracks are available
               * just reset the current song */
              indicatorHide();
              resetPosition();
              currentTrack().pause();

              /* hack: fix the slider position */
              var handler = $('#time_slider a.ui-slider-handle');
              var newpos = parseInt(handler.css('left')) - 1 + '%';
              handler.css({left: newpos});
            }
          },
          dataType: "json"
        });
    };
    $(".next_song_button").live('click', function(e) {
                            e.preventDefault();
                            next_song(true);
                          });
  });

/* callback invokated after soundmanager startup. can be overriden in the page as for setup_with_first use */
setupPlayList = function () {
  loadSong2(playlist_current_album(), playlist_current_track(), false);
};

/* load the current track. used by the playlist selector */
setupPlayListAndPlay = function () {
  loadSong2(playlist_current_album(), playlist_current_track(), true);
};

/* load the current track. used by the playlist selector but keep html */
softSetupPlayListAndPlay = function () {
  loadSong3(playlist_current_album(), playlist_current_track(), true);

};

soundManager.onload = function() {
  soundManager.debugMode = false;
  $("#vol_slider").slider('option', 'value', soundManager.defaultOptions.volume);
};


currentTrack = function() {
  return soundManager.getSoundById('currentTrack');
};

function postUpdate(fn) {
  return function () {
    createSlider();
    convert_links('#player_container');
    soundManager.album_title = $('.album_title a').text();
    fn();
    $('#time_slider').hide();
    $('#player_minimized_fake').show();
    $('#player').show();
    $('#player_container').show();
    activate_player();
    $('.player_toggle').show();
    $('#player_minimized_fake').css({display: 'inline-block'});
  };
}

/* update the player widget */
function updatePlayer(fn) {
  if(!parseInt(soundManager.album_id)) {
    return;
  };
  $('#player_container').load('/cw/player/album/' + soundManager.album_id + '/track/' + soundManager.track_index + '?' + 1*new Date() + ' #player', {}, postUpdate(fn));
};

function resetPosition() {
  $('#time_slider').slider('option', 'value', 0);
  $('#elapsed').text('00:00');
  currentTrack().setPosition(0);
};

/* change play buttons appareance */
function change_play_button_state() {
  $('.playBtn').removeClass('play_button_execution');
  $('.play_button_' + soundManager.album_id + '_' + soundManager.track_index).addClass('play_button_execution');
}

/* load a track in soundmanager. if track `data` is null, it calls the
backend to get the track data */
function loadSong(album_id, track_index, autoplay, data) {
  soundManager.album_id = album_id;
  soundManager.track_index = track_index;
  if (!data) {
    data = {};
    $.ajax({
      type: 'GET',
      dataType: 'json',
      cache: false,
      url: '/rs/album/' + album_id + '/track/' + track_index + '/brief.json',
      async: false,
      success: function(json, response) {
        data = json;
      },
      error: function(x,t,e) {
        busker_alert('Oops! An error occurred while processing your request. We are on it. Please try again later.', 'error');
      }
    });
  }

  if (data.length_msec > 0) {
    $('#time_slider').slider('option', 'max', data.length_msec - 500);
    $('#total_time').text(data.length);
  }

  if (currentTrack()) {
    resetPosition();
  }

  if (autoplay) {
    indicatorShow();
  };

  soundManager.destroySound('currentTrack');
  var track = soundManager.createSound(
    { id: 'currentTrack',
      url: data.url,
      autoLoad: autoplay,
      autoPlay: autoplay,
      onload: function() {
        if (this.bytesLoaded > 0) {
          if (this.playState == 0) {
            resetPosition();
            this.play();
          }
        } else {
          /* XXX. error in loading song */
          return ;
        }
        if ($('#time_slider').slider('option', 'max') == 0) {
          $('#time_slider').slider('option', 'max', this.durationEstimate);
          $('#total_time').text(this.durationEstimate);
        }
        indicatorHide();
      },
      onplay: function() {
        if (this.bytesLoaded > 0) {
        }
        indicatorHide();
        $('.player_play_button').hide();
        $('.stop_button').show();
        $('.stop_button').css({display: 'inline-block'});

        change_play_button_state();
      },
      onpause: function() {
        $('.stop_button').hide();
        $('.playBtn').removeClass('play_button_execution');
        $('.player_play_button').show();
      },
      onstop: function() {
        $('.stop_button').hide();
        $('.playBtn').removeClass('play_button_execution');
        $('.player_play_button').show();
      },
      onresume: function() {
        change_play_button_state();
        indicatorHide();
        $('.player_play_button').hide();
        $('.stop_button').show();
        $('.stop_button').css({display: 'inline-block'});
      },
      whileplaying: function() {
        var position = currentTrack().position;
        $('#time_slider').slider('option', 'value', position);
        var second = parseInt(position / 1000) + 1;
        var at_min = parseInt(second / 60);
        var at_sec = parseInt(second - at_min * 60);
        $('#elapsed').text(sprintf('%02d:%02d', at_min, at_sec));
      },
      onfinish: function () {
        $('.playBtn').removeClass('play_button_execution');
        indicatorShow();
        $.ajax({ url: '/f/music/end_play/' + soundManager.album_id + '/' + soundManager.track_index });
        next_song(true);
      }
    });
  return track;
};

/* load a song in sound manager, and perform a soft update of the player widget. Refactor with loadSong2 */
loadSong3 = function(album_id, track_index, autoplay, data) {

  $('.playBtn').removeClass('play_button_execution');
  if (!parseInt(album_id)) {
      postUpdate(function() {
                $('.player_track_selected').removeClass('player_track_selected');
              })();
    return false;
  }
  var previous_volume;
  if(currentTrack()) {
    previous_volume = currentTrack().volume;
  } else {
    previous_volume = soundManager.defaultOptions.volume;
  };
  if (soundManager.album_id == album_id && track_index == soundManager.track_index) {
    if(autoplay) {
      currentTrack().play();
    }
  };

  soundManager.album_id = album_id;
  soundManager.track_index = track_index;
  postUpdate(function() {
                $('.player_track_selected').removeClass('player_track_selected');
                $($('.playlist_album_' + album_id + '.playlist_track_' + track_index).children()[3]).addClass('player_track_selected');
                var track = loadSong(album_id, track_index, autoplay, data);
                track.setVolume(previous_volume);
                $("#vol_slider").slider('value', currentTrack().volume);
                return track;
              })();
  return true;
};

/* load a song in sound manager, and update the player widget */
function loadSong2(album_id, track_index, autoplay, data) {

  $('.playBtn').removeClass('play_button_execution');
  if (!parseInt(album_id)) {
    return false;
  }
  var previous_volume;
  if(currentTrack()) {
    previous_volume = currentTrack().volume;
  } else {
    previous_volume = soundManager.defaultOptions.volume;
  };
  if (soundManager.album_id == album_id && track_index == soundManager.track_index) {
    if (currentTrack().paused || autoplay) {
      currentTrack().play();
    }
    return true;
  };

  soundManager.album_id = album_id;
  soundManager.track_index = track_index;
  updatePlayer(function() {
                $('.player_track_selected').removeClass('player_track_selected');
                $($('.playlist_album_' + album_id + '.playlist_track_' + track_index).children()[3]).addClass('player_track_selected');
                var track = loadSong(album_id, track_index, autoplay, data);
                track.setVolume(previous_volume);
                $("#vol_slider").slider('value', currentTrack().volume);
                return track;
              });
};

playlist_current_album = function() {
  if ($(".player_track_selected").size() > 0)
    return $($(".player_track_selected").children('.album')[0]).text();
}

playlist_current_track = function() {
  if ($(".player_track_selected").size() > 0)
    return $($(".player_track_selected").children('.track_index')[0]).text();
};

function closePlayer() {
  currentTrack().stop();
  $('#player_container').slideUp();
  unconvert_links();
  return false;
}

function togglePlayer() {
};

function indicatorShow() {
  $('.player_play_button').hide();
  $('.stop_button').hide();
  $('.player .load_indicator').show();
}

function indicatorHide() {
  $('.player .load_indicator').hide();
  var is_paused = currentTrack().paused || !currentTrack().playState;
  if (is_paused) {
      $('.player_play_button').show();
  } else {
    $('.stop_button').show();
    $('.stop_button').css({display: 'inline-block'});
  }
}

