/*

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 myCurrentResults;
var myCurrentTab = "search";
var myTabResults = new Array();

var myQueuedClips = new Object();
    myQueuedClips.entries = new Array();

// Public

function getYouTube()
{
  mySelect = document.getElementById('youtube_select').value;
  myValue = document.getElementById('query_search').value;
  
  switch (mySelect)
  {
    case "search":
      searchYouTube(myValue);
      break; 
      
    case "favs":
      getFeed('http://gdata.youtube.com/feeds/users/' + myValue + '/favorites');
      break;
      
    case "uploads":
      getFeed('http://gdata.youtube.com/feeds/users/' + myValue + '/uploads');
      break;
      
    case "playlists":
      getFeed('http://gdata.youtube.com/feeds/api/users/' + myValue + '/playlists');
      break;
  }
}

function getVideo(thisItem)
{
  myOtherPlayer = (myCurrentPlayer == 1) ? 2 : 1;
  player = document.getElementById('jsplayer'+myOtherPlayer);

	window.console.log(this);

  if (player.getPlayerState() < 1)
  {
    processClipData(myOtherPlayer,thisItem);
  }
  else
  {
    myQueuedClips.entries.push(thisItem);
    
    myQueuelink = document.getElementById('queuelink');
    myQueuelink.innerHTML = "QUEUE (" + myQueuedClips.entries.length + ")";
  }
}  

function cueVideo(i,tabNumber)
{
  if (tabNumber == null)
  {
    thisItem = myCurrentResults.entries[i];
  }
  else
  {
    thisItem = myTabResults[tabNumber].entries[i];
  }  
  getVideo(thisItem);
}

function delVideo(i)
{
  myQueuedClips.entries.splice(i,1);
  showQueue();
}

function cueAllResults()
{
  for (clip in myCurrentResults.entries)
  {
    myQueuedClips.entries.push(clip);
  }
}

function searchYouTube(query)
{
  var src = 'http://gdata.youtube.com/feeds/videos';
  var youTubeRequest = src + '?vq='+query+'&max-results=20&alt=json-in-script&callback=receiveYouTube';
  myCurrentTab = "search";
  doJsonCall(youTubeRequest);
}

function getFeed(src)
{
  var youTubeRequest = src + '?max-results=20&start-index=1&alt=json-in-script&callback=receiveYouTube';
  myCurrentTab = "search";
  doJsonCall(youTubeRequest);
}

function getPage(src)
{
  var youTubeRequest = src + '&callback=receiveYouTube';
  doJsonCall(youTubeRequest);
}

function getPlaylist(src)
{
  var youTubeRequest = src + '?alt=json-in-script&callback=receiveYouTube';
  doJsonCall(youTubeRequest);
}

function receiveYouTube(youTubeResult)
{
  // document.getElementById('debug').innerHTML = "<pre>" + dump(youTubeResult) + "</pre>";
  
  myResults = getObjectsFromYouTubeJsonObject(youTubeResult);
  if (myCurrentTab == "search")
  {
    myCurrentResults = myResults;
  }
  else
  {
    myTabResults[myCurrentTab] = myResults;
  }
  searchResultsDiv = document.getElementById('searchresults');
  searchResultsDiv.innerHTML = createHtmlFromEntries(myResults);
}

function showQueue()
{
  searchResultsDiv = document.getElementById('searchresults');
  searchResultsDiv.innerHTML = createHtmlFromEntries(myQueuedClips,"queue");
  myCurrentTab = "queue";
}

function showYouTubeSearch()
{
  searchResultsDiv = document.getElementById('searchresults');
  searchResultsDiv.innerHTML = createHtmlFromEntries(myCurrentResults);
  myCurrentTab = "search";  
}

function createHtmlFromResultHeader(result)
{
  resultString = "<b>" + result.title + "</b> - ";
  resultString += result.total + " found";
//  resultString += " - <a href='Javascript:cueAllResults();'>CUE " + result.entries.length + " RESULTS</a>";
  
  myNextlink = document.getElementById('nextlink');
  myPrevlink = document.getElementById('prevlink');
  if (result.next != undefined)
  {
    myNextlink.setAttribute('href','Javascript:getPage("' + result.next + '");')
    myNextlink.setAttribute('class','');
  }
  else
  {
    myNextlink.setAttribute('href','#');
    myNextlink.setAttribute('class','disabled');
  }
  if (result.previous != undefined)
  {
    myPrevlink.setAttribute('href','Javascript:getPage("' + result.previous + '");')
    myPrevlink.setAttribute('class','');
  }
  else
  {
    myPrevlink.setAttribute('href','#');
    myPrevlink.setAttribute('class','disabled');
  }
  return resultString;
}  
  
function createHtmlFromEntries(result,tab)
{
  search_header = document.getElementById('search_header');
  search_header.innerHTML = createHtmlFromResultHeader(result);
  
  resultString = "";
  count = 0;
  
  for(var i in result.entries)
  {
    thisEntry = result.entries[i];
    if (thisEntry.playlistUrl != null)
    {
      count++;
      
      resultString += "<div class='halfunit'>";
      resultString += "<div class='scroller'><h3>" + thisEntry.title + "</h3>";
  	  resultString += "<p class='description'>";
  	  resultString += "<a class='button' href='Javascript:getPlaylist(\"" + thisEntry.playlistUrl + "\");'>[ VIEW ]</a> ";
  	  resultString += "<a class='button' href='Javascript:getVideo(1," + i + ");'>[ 1 ]</a> ";
  	  resultString += "<a class='button' href='Javascript:getVideo(2," + i + ");'>[ 2 ]</a> ";
  	  resultString += thisEntry.duration;
  	  resultString += "<br /><span class='author'>" + thisEntry.author + "</span>: ";
      resultString += thisEntry.description + "</p></div></div>";
      
      continue;
    }
    if (thisEntry.swfplayerUrl == null)
    {
    	count ++;
    	resultString += "<div class='halfunit'>";
      resultString += "<div class='scroller'><h3>" + thisEntry.title + "</h3>";
  	  resultString += "<p class='description'>";
  	  resultString += thisEntry.reason;
  	  resultString += "<br /><span class='author'>" + thisEntry.author + "</span>";
      resultString += "</p></div></div>";
      
      continue;
    }
    else
    {
      count++;
      
      resultString += "<div class='halfunit'>";
      resultString += "<img src='" + thisEntry.imageUrl + "' alt='" + thisEntry.title + "' title='" + thisEntry.title + "' class='thumb' />";
  	  resultString += "<div class='scroller'><h3>" + thisEntry.title + "</h3>";
  	  resultString += "<p class='description'>";
  	  
      if (tab == null) 
      {
  	    resultString += "<a class='button' href='Javascript:cueVideo(" + i + ");'>[ CUE ]</a> ";
  	  }
  	  else if (tab == "queue")
  	  {
  	    resultString += "<a class='button' href='Javascript:delVideo(" + i + ");'>[ DEL ]</a> ";
  	  }
  	  else
  	  {
  	    resultString += "<a class='button' href='Javascript:cueVideo(" + i + "," + tab + ");'>[ CUE ]</a> ";
  	  }
      resultString += "<a class='button' href='Javascript:getFeed(\"" + thisEntry.relatedUrl + "\");'>[ RELATED ]</a> ";
      resultString += "<a class='button' href='Javascript:getFeed(\"" + thisEntry.authorUrl + "/uploads\");'>[ UPS ]</a> ";
      resultString += "<a class='button' href='Javascript:getFeed(\"" + thisEntry.authorUrl + "/favorites\");'>[ FAVS ]</a> ";
      resultString += thisEntry.duration+ "<br />";
      resultString += "<span class='author'>" + thisEntry.author + "</span>: ";
      resultString += thisEntry.description + "</p></div></div>";
    }
  }

  if (count % 2 == 1)
  {
    resultString += "<div class='halfunit'></div>";	
  }
  return resultString;
}



function createNewTab()
{
  myAddTab = document.getElementById('addtab');
  myTabNumber = myTabResults.length
  myNewTab = document.createElement('li');
  myNewTab.setAttribute('id','tab_' + myTabNumber);
  
  myTitleAnchor = document.createElement('a');
  myTitleAnchor.setAttribute('href','Javascript:getTab("'+myTabNumber+'");');
  myTitleAnchor.appendChild(document.createTextNode(myCurrentResults.title));
  myNewTab.appendChild(myTitleAnchor);
  
  myCloseAnchor = document.createElement('a');
  myCloseAnchor.setAttribute('class','button');
  myCloseAnchor.setAttribute('href','Javascript:closeTab("'+myTabNumber+'");');
  myCloseAnchor.appendChild(document.createTextNode(' [x]'));
  myNewTab.appendChild(myCloseAnchor);
  
  myAddTab.parentNode.insertBefore(myNewTab,myAddTab);
  
  myTabResults.push(myCurrentResults);
}

function getTab(i)
{
  searchResultsDiv = document.getElementById('searchresults');
  searchResultsDiv.innerHTML = createHtmlFromEntries(myTabResults[i],i);
  myCurrentTab = i;
}

function closeTab(i)
{
  myTab = document.getElementById('tab_'+i);
  myTab.parentNode.removeChild(myTab);
}

// Json related

function doJsonCall(request)
{
  var scriptElement = document.createElement('script');
  scriptElement.type = 'text/javascript';
  scriptElement.src = request;
  
  var headElement = document.getElementsByTagName('head')[0];
  headElement.appendChild(scriptElement);
}

function getObjectsFromYouTubeJsonObject(feedResult)
{
  feedObjects = new Object();
  
  feedObjects.title = feedResult.feed.title.$t;
  feedObjects.total = feedResult.feed.openSearch$totalResults.$t;
  
  for (var i in feedResult.feed.link)
  {
    thisLink = feedResult.feed.link[i];
    if (thisLink.rel == 'next') { feedObjects.next = thisLink.href; }
    if (thisLink.rel == 'previous') { feedObjects.previous = thisLink.href; }
    if (thisLink.rel == 'self') { feedObjects.self = thisLink.href; }
  }
  
  feedObjects.entries = new Array();
  
  for (var i in feedResult.feed.entry)
  {
    thisEntry = feedResult.feed.entry[i];
   	
    feedObjects.entries[i] = new Object();
    feedObjects.entries[i].title = thisEntry.title.$t;
    feedObjects.entries[i].author = thisEntry.author[0].name.$t;
    feedObjects.entries[i].authorUrl = thisEntry.author[0].uri.$t;
    
    window.console.log(thisEntry);
    if ((thisEntry.app$control)&&(thisEntry.app$control.yt$state)) {
    	feedObjects.entries[i].reason = thisEntry.app$control.yt$state.name;
    }
    
    for (var j in thisEntry.link)
    {
      thisLink = thisEntry.link[j];
      if (thisLink.rel == "alternate") { feedObjects.entries[i].youtubeUrl = thisLink.href; }
      if (thisLink.rel.indexOf("related") > 0) { feedObjects.entries[i].relatedUrl = thisLink.href; }
    }
    
    if (thisEntry.media$group)
    {
      if (thisEntry.media$group.yt$duration) {
      	var seconds = thisEntry.media$group.yt$duration.seconds;
      	var minutes = Math.floor(seconds/60);
      	seconds = seconds - (minutes*60);
      	if (seconds < 10) { seconds = "0" + seconds; }
      	feedObjects.entries[i].duration = minutes + ":" + seconds;
      }
      if (thisEntry.media$group.yt$duration) {
      	feedObjects.entries[i].description = thisEntry.media$group.media$description.$t;
      }
      if (thisEntry.media$group.media$content) { 
      	feedObjects.entries[i].swfplayerUrl = thisEntry.media$group.media$content[0].url;
      }
      if (thisEntry.media$group.media$thumbnail) {
	      feedObjects.entries[i].imageUrl = thisEntry.media$group.media$thumbnail[3].url;
    	}
    }
    else
    {
    	// this is for searcing PLAYLISTS! (so the if-statement is kinda rukkie)
      feedObjects.entries[i].description = thisEntry.content.$t;
      feedObjects.entries[i].playlistUrl = thisEntry.gd$feedLink.href;
      feedObjects.entries[i].duration = thisEntry.gd$feedLink.countHint + " clips";
      feedObjects.entries[i].swfplayerUrl = feedObjects.entries[i].youtubeUrl.replace(/view_play_list\?p=/, "p/");
    }
  }
  return feedObjects;
}