$(document).ready(function(){
  currentVideoIndex = 0;
  
  /*
  $('#query').focus(function(){
    if (this.value == 'Artist or Band') {
      this.value = '';
    };
  });
  
  $('#query').blur(function(){
    if (this.value == '') {
      this.value = 'Artist or Band';
    };
  })
  */
  
  $("#playlist li").live('click', function(){
    var nId = parseInt(this.id.replace('video_', ''));
    var v = videos[nId];
    setVideo(v);
    if (nId == videos.length - 1) {
      grabMoreVideosFor(v);
    };
  })
  
  if (document.getElementById('ytPlayer')) {
    // randomize the initial videos
    fisherYates(videos);
    
    buildPlaylist();
    
    // display video player
    var params = {allowScriptAccess: "always", allowFullScreen: "true"};
    var atts = {id: 'tgytplayer'};
    currentVideo = videos[0];
    swfobject.embedSWF(currentVideo.link, 'ytPlayer', "580", "420", "8",
                       null, null, params, atts, setTitle(currentVideo));
    setTwitterLink(currentVideo);
    
    // grab more videos
    grabMoreVideosFor(currentVideo);
    
    $('#next_video').click(function(){
      loadNextVideo();
      return false;
    });
  };
})

var highlightCurrentVideoOnPlaylist = function() {
  var playlistItem = document.getElementById('playlist');
  var listItems = playlistItem.getElementsByTagName('li');
  for (var i=0; i < listItems.length; i++) {
    listItems[i].className = '';
  };
  listItems[currentVideoIndex].className = 'selected';
}

var buildPlaylist = function() {
  var playlistItem = document.getElementById('playlist');
  playlistItem.innerHTML = '';
  for (var i=0; i < videos.length; i++) {
    var video = videos[i];
    var listItem = document.createElement('li');
    listItem.id = 'video_'+i;
    
    var imageItem = document.createElement('img');
    imageItem.src = 'http://i.ytimg.com/vi/' + video.id + '/default.jpg';
    imageItem.width = 77;
    imageItem.height = 58;
    imageItem.alt = video.artist + ' - ' + video.track
    
    /*
    var linkItem = document.createElement('a');
    linkItem.href = '/a/' + video.uri;
    linkItem.innerHTML = video.artist;
    */
    var linkItem = document.createElement('span');
    // linkItem.href = '/a/' + video.uri;
    linkItem.innerHTML = video.artist;
    linkItem.className = 'artist';
    
    // var breakItem = document.createElement('br');
    
    var trackItem = document.createElement('span');
    trackItem.className = 'track';
    trackItem.innerHTML = video.track;
    
    listItem.appendChild(imageItem);
    listItem.appendChild(linkItem);
    //listItem.appendChild(breakItem);
    listItem.appendChild(trackItem);
    
    playlistItem.appendChild(listItem);
  };
  highlightCurrentVideoOnPlaylist();
}

var grabMoreVideosFor = function(video) {
  $('#playlist_text').addClass('loading');
  // hide the skip link
  // $('#next_video').attr('disabled', 'disabled'); //.hide();
  // $('#next_video').text('Loading…');
  // skippingAllowed = false;
  
  var url = '/a/' + video.uri + '.json'
  jQuery.getJSON(url, function(data) {
    // store the last video (to seed the grabbingMoreVideos when needed)
    lastVideo = data[data.length-1];
    // randomize the new videos
    fisherYates(data);
    
    if (videos.length <= 2) {           // if we have 2 or less videos
      videos = data;                    // replace the whole array
    } else {
      videos = videos.concat(data);     // append new videos
    };
    buildPlaylist();
    // $('#next_video').removeAttr('disabled'); //.fadeIn();
    // $('#next_video').text('Skip');
    // skippingAllowed = true;
    $('#playlist_text').removeClass('loading');
  });
};

var loadNextVideo = function() {
  currentVideoIndex = videos.indexOf(currentVideo);
  // if the next video is the last
  if (currentVideoIndex >= videos.length-3) {
    grabMoreVideosFor(lastVideo);
  };
  currentVideo = videos[currentVideoIndex + 1];
  setVideo(currentVideo);
}

var showPlaylist = function() {
  var list = document.createElement('ul');
  for (var i = videos.length - 1; i >= 0; i--){
    var v = videos[i];
    var vItem = document.createElement('li');
    vItem.appendChild(document.createTextNode(v.title));
    list.appendChild(vItem);
  };
  var playlistContainer = document.getElementById('playlist');
  playlistContainer.appendChild(list);
}

function onYouTubePlayerReady() {
  ytplayer = document.getElementById('tgytplayer');
  ytplayer.addEventListener("onStateChange", "onytplayerStateChange");
  // ytplayer.addEventListener("onError", "nextVideo");
}

function onytplayerStateChange(newState) {
  /*
  Possible values are:
    unstarted (-1)
    ended (0)
    playing (1)
    paused (2)
    buffering (3)
    video cued (5)
  */
  if (newState == 0) {
    loadNextVideo();
  };
  if (newState == 3) {
    $('#next_video').attr('disabled', 'disabled'); //.hide();
  };
  if (newState == 1 && skippingAllowed) {
    $('#next_video').removeAttr('disabled'); //.fadeIn();
  }
}

function setVideo (video) {
  setupVideo(video);
  var ytPlayer = document.getElementById('tgytplayer');
  ytPlayer.loadVideoById(video['id'], 0, 'large');
  highlightCurrentVideoOnPlaylist();
  setTwitterLink(video);
}

function setupVideo (video) {
  setTitle(video);
  currentVideo = video;
  currentVideoIndex = videos.indexOf(video);
}

function setTwitterLink(video) {
  var l = document.getElementById('twitter_share_link');
  var message = 'Check this out: '+video.track+' by '+video.artist+' http://tubegenius.com/v/'+video.id+' #TubeGenius';
  var href = 'http://twitter.com/home?status='+encodeURIComponent(message);
  l.href = href;
}

function setTitle (video) {
  var titleElement = document.getElementById('currently_playing');
  titleElement.innerHTML = '';
  if (videos.length > 2) {
    var artistElement = document.createElement("a");
    artistElement.href = "/a/" + video.uri;
  } else {
    var artistElement = document.createElement("span");
  };
  artistElement.appendChild(document.createTextNode(video.artist));
  var trackElement = document.createElement('span');
  trackElement.appendChild(document.createTextNode(' - ' + video.track));
  titleElement.appendChild(artistElement);
  titleElement.appendChild(trackElement);
}

function fisherYates ( myArray ) {
  var i = myArray.length;
  if ( i == 0 ) return false;
  while ( --i ) {
     var j = Math.floor( Math.random() * ( i + 1 ) );
     var tempi = myArray[i];
     var tempj = myArray[j];
     myArray[i] = tempj;
     myArray[j] = tempi;
   }
}

function randomOrder () {
  return (Math.round(Math.random()) - 0.5);
}
