/*

LaptopJam is created by elfling.nl in 2008
LaptopJam is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Netherlands License.
http://creativecommons.org/licenses/by-nc-nd/3.0/nl/

*/

// Globals

var myCurrentPlayer;
var fadeActive = false;
var fadeStart;

// Onload init of players

function startPlayers()
{
  startSliders();
  
  createPlayer(1);
  createPlayer(2);
}

// Public

function togglePlay(playerID)
{
  player = document.getElementById('jsplayer'+playerID);
  if (player.getPlayerState() == 2)
  {
    player.playVideo();
    myCurrentPlayer = playerID;
  }
  else
  {
    player.pauseVideo();
    myCurrentPlayer = (myCurrentPlayer == 1) ? 2 : 1;
  }
}

function recuePlayer(playerID)
{
  player = document.getElementById('jsplayer'+playerID);
  player.seekTo(0); 
}

function startFade()
{
  myOtherPlayer = (myCurrentPlayer == 1) ? 2 : 1;
  player = document.getElementById('jsplayer'+myOtherPlayer);
  
  if (player.getPlayerState() == 2)
  {
    fadeActive = true;
    player.playVideo();
    myCurrentPlayer = myOtherPlayer;
  }
}

function getVideoFromQueue()
{
  myOtherPlayer = (myCurrentPlayer == 1) ? 2 : 1;
  newVideoFromQueue(myOtherPlayer);
  if (myCurrentTab == "queue")
  {
    showQueue();
  }
}

// Interval

function intervalStatusUpdate()
{
  // do status bars and borders of both players
  updatePlayerLook(1);
  updatePlayerLook(2);

  autoplay = document.getElementById('autoplay').checked;
  if (autoplay)
  {
    player1 = document.getElementById('jsplayer1');
    player2 = document.getElementById('jsplayer2');
      
    // autoplay next
    if ((myCurrentPlayer == 1) && (player1.getPlayerState() == 1))
    {
      remainingPlaytime = player1.getDuration() - player1.getCurrentTime();
    }
    if ((myCurrentPlayer == 2) && (player2.getPlayerState() == 1))
    {
      remainingPlaytime = player2.getDuration() - player2.getCurrentTime();
    }
    if ((player1.getPlayerState() == 1) || (player2.getPlayerState() == 1))
    {
      myRemaining = document.getElementById('remaining');
      var minutes = Math.floor(remainingPlaytime/60);
      var seconds = Math.floor(remainingPlaytime) - (minutes*60);
      if (seconds < 10) { seconds = "0" + seconds; }
      myRemaining.innerHTML = "remaining: "+ minutes + ":" + seconds;
      
      if (remainingPlaytime <= document.getElementById('crossoverDuration').value)
      {
        startFade();
      }
    }
            
    // autofade
    if (fadeActive == true)
    {
      totalFadeTime = document.getElementById('crossoverDuration').value;
      pastFadeTime = (myCurrentPlayer == 1) ? player1.getCurrentTime() : player2.getCurrentTime();
      
      FadePart = pastFadeTime / totalFadeTime;
       
      mySliderValue = (myCurrentPlayer == 1) ? 100 - Math.floor(FadePart * 200) :  Math.floor(FadePart * 200) - 100;
      setSliderPos('crossFaderSlider', mySliderValue);
      
      if (pastFadeTime > totalFadeTime)
      {
        fadeActive = false;
        // get new video only when we are still not at the end of the clip
        otherPlayer = (myCurrentPlayer == 1) ? 2 : 1;
        player = document.getElementById('jsplayer' + otherPlayer);
        if (player.getCurrentTime() < player.getDuration())
        {
          getVideoFromQueue();
        }
      }
    }
  }
  setPlayersVolume();
}

// Private

function updatePlayerLook(playerID)
{
  player = document.getElementById('jsplayer'+playerID);
  if (player != null)
  { 
    // load and played status bars
    played = Math.floor(320 * player.getCurrentTime() / player.getDuration());
    loaded = (player.getVideoBytesLoaded() == -1) ? 0 : Math.floor(320 * player.getVideoBytesLoaded() / player.getVideoBytesTotal());
  
    loadedbar = document.getElementById('loaded'+playerID);
    loadedbar.style.width = loaded;
    playedbar = document.getElementById('played'+playerID);
    playedbar.style.width = played;
    
    // show Active border
    myDiv = document.getElementById('player'+playerID);
    myDiv.className = ((player.getPlayerState() == 1) && (!player.isMuted())) ? 'player active' : 'player';
  }
}

function setPlayersVolume()
{
  slider1 = document.getElementById('leftPlayerVolumeDisplay').value;
  slider2 = document.getElementById('rightPlayerVolumeDisplay').value;
  crossSlider = document.getElementById('crossFaderDisplay').value;
  
  volume1 = (crossSlider < 0) ? slider1 : (slider1 * (100 - crossSlider)/100);
  volume2 = (crossSlider >= 0) ? slider2 : (slider2 * (-100 - crossSlider)/-100);
  
  player1.setVolume(volume1);
  player2.setVolume(volume2);
}

function newVideoFromQueue(playerID)
{
  player = document.getElementById('jsplayer'+playerID);
  if (myQueuedClips.entries.length == 0)
  {
    player.stopVideo();
    player.clearVideo();
    clearDatascreen(playerID);
  }
  else
  {
    thisItem = myQueuedClips.entries.shift();
    processClipData(playerID,thisItem);
    
    myQueuelink = document.getElementById('queuelink');
    myQueuelink.innerHTML = "QUEUE (" + myQueuedClips.entries.length + ")";
  }
}

function processClipData(playerID,thisItem)
{
  parts = thisItem.youtubeUrl.split("=");
  videoID = parts[(parts.length-1)];
  thePlayer = document.getElementById('jsplayer'+playerID);
  thePlayer.mute();
  thePlayer.loadVideoById(videoID, 0);  
  
  theDatascreen = document.getElementById('datascreen' + playerID);
  theDatascreen.innerHTML = createDatascreen(thisItem);  
}

function createPlayer(playerID)
{
  swfSource = "http://gdata.youtube.com/apiplayer/cl.swf?key=AI39si7KiELZeczR4yuB5Z5u5tbYUWMvJ90mb641uxOOKyB2D0nN9GpslfPjZAzVlrEkzExyt35TFC9qPcppFfxMHKmDiX3_Xg&enablejsapi=1&playerapiid=player"+playerID+"&";

  var params = { allowScriptAccess: "always", wmode: "transparent" };
  var atts = { id: "jsplayer" + playerID };
  swfobject.embedSWF(swfSource, 'swfplayer' + playerID, "320", "240", "8", null, null, params, atts);
}
  
function createDatascreen(thisItem)
{
  resultString = "<h2>" + thisItem.title + "</h2>";
  resultString += "<p class='description'>";
  resultString += "<a class='button' href='Javascript:getFeed(\"" + thisItem.relatedUrl + "\");'>[ RELATED ]</a> ";
  resultString += "<a class='button' href='Javascript:getFeed(\"" + thisItem.authorUrl + "/uploads\");'>[ UPS ]</a> ";
  resultString += "<a class='button' href='Javascript:getFeed(\"" + thisItem.authorUrl + "/favorites\");'>[ FAVS ]</a> ";
  resultString += "<a class='button' href='" + thisItem.youtubeUrl + "' target='_blank');'>[ OPEN IN YOUTUBE ]</a> ";
  resultString += thisItem.duration+ "<br />";
  resultString += "<span>" + thisItem.author + "</span>: " + thisItem.description + "</p></div>";
  
  return resultString;
} 

function clearDatascreen(playerID)
{
  theDatascreen = document.getElementById('datascreen' + playerID);
  theDatascreen.innerHTML = "<h2>- empty -</h2>"; 
}

// Events
var loadedPlayerCounter = 0;

function onYouTubePlayerReady(playerId)
{
  loadedPlayerCounter++;
  if (loadedPlayerCounter == 2)
  {
    player = document.getElementById('jsplayer1');
    player.addEventListener("onStateChange", "onStateChangePlayer1");
    player = document.getElementById('jsplayer2');
    player.addEventListener("onStateChange", "onStateChangePlayer2");
    
    setInterval(intervalStatusUpdate, 250);
  }
}

function onStateChangePlayer1(newState)
{
  playerStateChanged(1,newState);
}

function onStateChangePlayer2(newState)
{
  playerStateChanged(2,newState);
}

function playerStateChanged(playerID,newState)
{
  thisPlayer = document.getElementById('jsplayer'+playerID);
  otherID = (playerID == 1) ? 2 : 1;
  otherPlayer = document.getElementById('jsplayer'+otherID);
  
  autoplay = document.getElementById('autoplay').checked;
  
  switch (newState)
  {
    case -1:
      newStateName = "unstarted";
      break;
      
    case 0:
      newStateName = "ended";
      // load new clip from queue
      if (!thisPlayer.isMuted())
      {
        thisPlayer.mute();
        getVideoFromQueue();
      }
      // other player ended too? no currentPlayer
      if (otherPlayer.getPlayerState() == 0)
      {
        myCurrentPlayer = null;
      }
      break;
      
    case 1:
      newStateName = "playing";
      // autostart first loaded clip
      if ((myCurrentPlayer == null) && (autoplay))
      {
        thisPlayer.unMute();
        myCurrentPlayer = playerID;
        // set crossfaderslider
        mySliderValue = (myCurrentPlayer == 1) ? -100 : 100;
        setSliderPos('crossFaderSlider', mySliderValue);
      }
      // really cue clip
      if (thisPlayer.isMuted())
      {
        thisPlayer.pauseVideo();
        thisPlayer.unMute();
        thisPlayer.seekTo(0);
      }
      break;
      
    case 2:
      newStateName = "paused";
      break;
      
    case 3:
      newStateName = "buffering";
      break;
      
    case 5:
      newStateName = "video cued";
      break;
      
  }
  debugScreen = document.getElementById('debug');
  debugScreen.innerHTML = "player"+playerID+":"+ newStateName+":"+myCurrentPlayer+"<br />";
}