// djr.js

// Globals and namespace definition.


// Namespace.
djr = {};

// Global state (with Player instance).
djr.state = {
  userid: null,
  backend: null,
  player: null,
  loadingCount: 0
};

// Initialize the Player and add all our onclick handlers.
djr.init = function (userid) {
  djr.state.userid = userid;
  djr.state.backend = new djr.Backend();
  djr.state.player = new djr.Player(djr.state.backend, '#djr_player');

  // Set a callback on URL hash changes.
  $(window).bind('hashchange', djr.history.restore);

  // Set autocompletion and search handlers.
  $('#queryField').autocomplete('/autocomplete', {
    queryParamName: 'term',
    maxItemsToShow: 50,
    delay: 150,
    minChars: 2
  });

  $('#queryField').focus();
  $('#searchForm').submit(function() {
    var query_string = $('#queryField').val();
    djr.state.player.search(query_string);
    return false;
  });
  $('#searchWarnMsg').click(function() {
    $(this).hide();
  });

  // Add onclick hooks to the playlist controls.
  $('#playlistClearBtn').click(function() {
    djr.player().clearPlaylist();
  });
  $('#playlistStreamBtn').click(function() {
    djr.player().streamCurrentPlaylist();
  });
  $('#playlistExtendBtn').click(function() {
    djr.player().extendCurrentPlaylist();
  });
  $('#playlistLast5').click(function() {
    djr.player().lastPlaylist(5);
  });
  $('#playlistLast25').click(function() {
    djr.player().lastPlaylist(25);
  });
  $('#playlistRandom5').click(function() {
    djr.player().randomPlaylist(5);
  });
  $('#playlistRandom25').click(function() {
    djr.player().randomPlaylist(25);
  });
  $('#playlistMost5').click(function() {
    djr.player().mostPlayedPlaylist(5);
  });
  $('#playlistMost25').click(function() {
    djr.player().mostPlayedPlaylist(25);
  });
  $('#playlistNever5').click(function() {
    djr.player().neverPlayedPlaylist(5);
  });
  $('#playlistNever25').click(function() {
    djr.player().neverPlayedPlaylist(25);
  });
  $('#playlistSave').click(function() {
    if ( $('#saveForm').is(':visible') == false ) {
      if (djr.playlist && djr.playlist.title) {
        $('#savetext').val(djr.playlist.title);
      }
      $('#saveForm').show('fast');
      $('#savetext').focus();
    } else {
      $('#savetext').val('');
      $('#saveForm').hide();
    }
  });
  $('#playlistSaveBtn').click(function() {
    var pltitle = $('#savetext').val();
    if (pltitle != '') {
      djr.player().savePlaylistWithTitle(pltitle);
      djr.updatePlaylists();
    }
    $('#saveForm').hide();
  });
  $('#wikibtn').click(function () {
    var stitle = $('#song_' + djr.player().cur_song + ' .artist').text();
    if ( $('#wikipedia').is(':visible') == false ) {
      if ( stitle != "" ) { 
        stitle = stitle.split(' ').join('+');
        $('#wikipedia').show('slow');
        //$('#wikipedia').attr("src", "/ext?url=" + escape("http://en.wikipedia.org/wiki/Special:Search?search=" + stitle + "&go=Go"));
        $('#wikipedia').attr("src", "http://en.m.wikipedia.org/w/index.php?search=" + stitle);
      }
    } else {
        $('#wikipedia').hide('slow')
    }
  });
  $('#lastfmbtn').click(function () {
    var stitle = $('#song_' + djr.player().cur_song + ' .title').text();
    var sartist = $('#song_' + djr.player().cur_song + ' .artist').text();
    if ( $('#lastfm').is(':visible') == false ) {
      if ( stitle != "" ) { 
        stitle = stitle.split(' ').join('+');
        sartist = sartist.split(' ').join('+');
        $('#lastfm').show('slow');
        //$('#lastfm').attr("src", "/ext?url=" + escape("http://www.lastfm.com/#&q=" + stitle + sartist));
        $('#lastfm').attr("src", "http://m.last.fm/search?q=" + stitle + sartist );
      }
    } else {
        $('#lastfm').hide('slow')
    }
  });
  $('#lyricsbtn').click(function () {
    var stitle = $('#song_' + djr.player().cur_song + ' .title').text();
    if ( $('#lyrics').is(':visible') == false ) {
      if ( stitle != "" ) { 
        stitle = stitle.split(' ').join('+');
        $('#lyrics').show('slow');
        //$('#lyrics').attr("src", "/ext?url=" + escape("http://www.lyrics.com/#&q=" + stitle));
        $('#lyrics').attr("src", "http://lyrics.wikia.com/index.php?search=" + stitle + "&fulltext=0" );
      }
    } else {
        $('#lyrics').hide('slow')
    }
  });
  $('#pllistbtn').click(function () {
    if ($('#pllist').is(':visible') == false) {
      djr.updatePlaylists();
      $('#pllist').show('slow');
    } else {
      $('#pllist').hide('slow')
    }
  });

  // Set the album art image to auto-fullscreen on load.
  $('#albumart_fs').load(function() {
    $(this).fullBg();
    $(this).show();
  });

  djr.debug('initialization done.');

  djr.updatePlaylists();
};

// Export the player for quick onclick access
djr.player = function() {
  return djr.state.player;
};

// Update the list of playlists.
djr.updatePlaylists = function() {
  djr.state.backend.getPlList(djr.state.userid, function(results) {
    if (results.length == 0) {
      djr.debug('No playlists found.');
      return;
    }
    var output = '<ul>';
    $.each(results, function(idx, x) {
      if (x.title) {
        output += "<li><a onclick='djr.player().loadPlaylist(\"" + x.uuid + "\")' >"  + x.title + "</a></li>";
      }
    });
    output += '</ul>';
    $('#pllist').html(output);
  });
};

// Show/hide the 'loader' animated GIF.
// Keep a counter so we can nest calls.
djr.loading = function(active) {
  var loader = $('#loaderImg');
  if (active) {
    djr.state.loadingCount += 1;
  } else {
    djr.state.loadingCount -= 1;
  }
  if (djr.state.loadingCount > 0) {
    loader.show();
  } else {
    loader.hide();
  }
};

// Debugging.
djr.debug = function(msg) {
  var n_logs = $('#debug p').length;
  if (n_logs > 7) {
    $('#debug p:first').remove();
  }
  $('#debug').append('<p>' + msg + '</p>');
};

// Report a player error.
djr.playerError = function(event) {
  console.log(event.jPlayer.error);
  switch(event.jPlayer.error.type) {
  case $.jPlayer.error.URL:
    djr.debug('Error downloading song, skipping...')
    if (djr.state.player) {
      djr.state.player.nextSong();
    }
    break;
  default:
    djr.debug('Error: unexpected error (' + event.jPlayer.error.message + ')');
    break;
  }
};

// Show a search-related warning message.
djr.showSearchWarning = function(msg) {
  $('#searchWarnMsg').text(msg).show('fast');
};

djr.clearSearchWarning = function() {
  $('#searchWarnMsg').hide();
};

// Generate a random UUID.
var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
djr.generateRandomId = function() {
  var uuid = [], chars = CHARS, i;
  var len = 40, radix = chars.length;
  for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
  return uuid.join('');
};