<!--
// jQuery.noConflict();
// RUN

var DEBUG = false;
var API_KEY = "AI39si4-pcWjyenel__AR_7e8d9hL4_sRbfVzPH6S_WRH5FdPzUejv9ZrIEioW9gO5AOJtiFOkTxeX3q3YCQz_E_2t0ERkfuDA";

var VOLUME = 60;
var mute = false;
var play = true;

var crossfade = 18; //seconds

var leftplayer, rightplayer;

//player state constants
var UNSTARTED = -1;
var ENDED = 0;
var PLAYING = 1;
var PAUSED = 2;
var BUFFERING = 3;
var CUED = 5;

var LOAD = -1;
var LEFT = 0;
var RIGHT = 1;
var STATE = LOAD;

var collector, collectionsize = false;

function onYouTubePlayerReady(player) {
	
	//this shouldn't be so hardcoded
	if ( player == LEFT) {		
		leftplayer = $("#leftvideoplayer").get(0);
		leftplayer.addEventListener("onStateChange", "onLeftStateChange");
		leftplayer.addEventListener("onError", "onLeftError");
		leftplayer.setVolume(VOLUME);
	} 
	else if (player == RIGHT) {		
		rightplayer = $("#rightvideoplayer").get(0);	
		rightplayer.addEventListener("onStateChange", "onRightStateChange");
		rightplayer.addEventListener("onError", "onRightError");
		rightplayer.setVolume(VOLUME);
	}
}

function onLeftError(error) {
	debug("left error: " + error);
	cueNextRecord(LEFT);
}
function onRrightError(error) {
	debug("right error: " + error);
	cueNextRecord(RIGHT);
}
function onLeftStateChange(state) {
	debug(" L");
	switch(state) {
		case ENDED:
			cueNextRecord(LEFT);
			break;
		case PLAYING:
			if (STATE == RIGHT) { debug(54); STATE = LEFT; cueNextRecord(RIGHT);}
			break;
		case BUFFERING:
			//visually indicate buffering state
			break;
		case CUED:
			if (STATE == LEFT) leftplayer.playVideo();
			break;
	}
}
function onRightStateChange(state) {
	debug(" R");
	switch(state) {
		case ENDED:
			cueNextRecord(RIGHT);
			break;
		case PLAYING:
			if (STATE == LEFT) { debug(74); STATE = RIGHT; cueNextRecord(LEFT);}
			break;
		case BUFFERING:
			//visually indicate buffering state
			break;
		case CUED:
			if (STATE == RIGHT) rightplayer.playVideo();
			break;
	}
}
function cueNextRecord(target) {
	//targetplayer.cueVideoById("sY6z2hLgYuY");
	debug("start cueing " + target);
	
	var startindex = parseInt(Math.random()*collectionsize-1);

	var url = "http://gdata.youtube.com/feeds/api/users/" + collector + "/uploads?alt=json&callback=?&max-results=10&start-index=" + startindex;

	if (target == LEFT) {
		debug("cueing LEFT");
		
		leftplayer.stopVideo();
//		leftplayer.clearImage();
		$.getJSON(url, 
			function (records) {
				cueLeftRecord(records);
			});
	}
	else {
		rightplayer.stopVideo();
//		rightplayer.clearImage();
			debug("cueing RIGHT");
		$.getJSON(url, 
			function (records) {
				cueRightRecord(records);
			});
	}
}

function cueLeftRecord(records) {
	var record = records.feed.entry;	
	var id = getVideoId(record[0].id.$t); 
	debug("cueing left " + id);
	leftplayer.cueVideoById(id, 0);
	updateTitle(LEFT, record[0].title.$t, id);	
	
}

function cueRightRecord(records) {
	var record = records.feed.entry;	
	var id = getVideoId(record[0].id.$t); 
	debug("cueing right " + id);	
	rightplayer.cueVideoById(id, 0);
	updateTitle(RIGHT, record[0].title.$t, id);	
	
}

function getVideoId( url) {	
	var tokens = url.split("/");
	return tokens[tokens.length-1];
}

function setCollectionSize() {
	var url = "http://gdata.youtube.com/feeds/api/users/" + collector + "/uploads?alt=json&callback=?&max-results=10&start-index=1";
	$.getJSON(url, function (records) {
		collectionsize = records.feed.openSearch$totalResults.$t;
		debug("collection size: " + collectionsize);
	});
}

function monitor() { 	
	
	updateTimes();
	
	var lefttime = parseInt(leftplayer.getDuration() - leftplayer.getCurrentTime()); 
	var righttime = parseInt(rightplayer.getDuration() - rightplayer.getCurrentTime());
	
	if (STATE == LOAD && collectionsize) {
		debug("loading");
		STATE = LEFT;	
		cueNextRecord(LEFT);
		cueNextRecord(RIGHT);
	}
	else if (STATE == LEFT && lefttime > 0 && lefttime <= crossfade) {
		debug("crossfade 139");
		STATE = RIGHT;
		if (rightplayer.getPlayerState() != CUED ) cueNextRecord(RIGHT);
		rightplayer.playVideo();
	}
	else if (STATE == RIGHT && righttime > 0 && righttime <= crossfade) {
		debug("crossfade 147");
		STATE = LEFT;	
		if (leftplayer.getPlayerState() != CUED ) cueNextRecord(LEFT);
		leftplayer.playVideo();
	}
}

function setVolume(volume) {
	if (volume) VOLUME = volume;
	if (mute) {
		leftplayer.setVolume(0);
		rightplayer.setVolume(0);		
	}
	else {
		leftplayer.setVolume(VOLUME);
		rightplayer.setVolume(VOLUME);		
	} 
}

function updateTimes() {
	
	var lefttime = parseInt(leftplayer.getDuration() - leftplayer.getCurrentTime()); 
	var righttime = parseInt(rightplayer.getDuration() - rightplayer.getCurrentTime());

	lefttime = timeToString(lefttime);
	righttime = timeToString(righttime);

	$("#lefttime").text(lefttime);
	$("#righttime").text(righttime);
}

function updateTitle(target, title, video) {
	var html = "<a href='http://www.youtube.com/watch?v=" + video + "' target='_blank'>" + title + "</a>";
	if(target == LEFT) $("#lefttitle").html(html);
	else $("#righttitle").html(html);
}

function timeToString(secs) {
	var min = parseInt(secs / 60);
	secs = (secs - min * 60);
	if (secs < 10) secs = "0" + secs;
	if(min + secs <= 0) return "-:--";
	else return min + ":" + secs;
}

jQuery(document).ready( function(){
	
	$("#volumeslider").slider({
		orientation: "vertical",
		range: "max",
		min: 0,
		max: 100,
		value: VOLUME,
		slide: function(event, ui) {
			setVolume(ui.value);
			$("#volumelevel").text(ui.value);
		}
	});

	$("#volumelevel").text($("#volumeslider").slider("value"));
	
	collector = getParam("collector");
	if (!collector) collector = $("#collectors li:first a").text();
	setCollectionSize(collector)
		
	var params = { allowScriptAccess: "always" };
	var atts = { id: "leftvideoplayer" };
	
    swfobject.embedSWF("http://www.youtube.com/apiplayer?key=" + API_KEY + "&enablejsapi=1&playerapiid=" + LEFT,
	"leftvideo", "400", "300", "9.0.0", null, null, params, atts);
	
	var atts = { id: "rightvideoplayer" };	
    swfobject.embedSWF("http://www.youtube.com/apiplayer?key=" + API_KEY + "&enablejsapi=1&playerapiid=" + RIGHT,
	"rightvideo", "400", "300", "9.0.0", null, null, params, atts);

	setInterval(monitor, 1000);

	// mute
	$("#mute").click( function() {
		mute = !mute;
		setVolume();
		if (mute) $(this).addClass("muted");
		else $(this).removeClass("muted");
	});
	
	// play/pause
	$("#playpause").click( function() {
		play = !play;
		if (!play) {
			if(leftplayer.getPlayerState() == PLAYING || leftplayer.getPlayerState() == BUFFERING)
				leftplayer.pauseVideo();
			if(rightplayer.getPlayerState() == PLAYING || rightplayer.getPlayerState() == BUFFERING)	
				rightplayer.pauseVideo();
			$(this).addClass("paused");	
		} 
		else {
			//resume playback
			if( leftplayer.getPlayerState() == 2 ) leftplayer.playVideo();
			if( rightplayer.getPlayerState() == 2 ) rightplayer.playVideo();			
			$(this).removeClass("paused");	
		} 
	});
	

	
	//replace w/ jquery method***************************************************************************************************************/
	function getParam( param ) {
	  param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+ param +"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( window.location.href );
	  if( results == null )
	    return false;
	  else
	    return results[1];
	}
	/****************************************************************************************************************************************/

	
	// interactive styling
	
	$("#playpause").mousedown( function() {
		$(this).css("backgroundColor","#A6A18f");
	});
	
	$("#playpause").mouseup( function() {
		$(this).css("backgroundColor","#CCC7B0");
	});
	
	$("h1").hover(
		function () { $(this).fadeTo(200, 1); },
		function () { $(this).fadeTo(500, 0.2); }
	);
	
	$("#players").corner("round 5px");
	$("#volume").corner("round 5px");
	$("#collectors a").corner("round top 5px");

	$("#volumeslider").corner("round 3px");
	$("#volumeslider *").corner("round 3px");

	$("#playpause").corner("round 3px");
	$("#mute").corner("round 3px");
	
});


function getParam(param) {
  param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+ param +"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return false;
  else
    return results[1];
}

function debug( message ) {
	if ( DEBUG ) {
		if ( $("#debug").length == 0) $("body").append("<ul id='debug'></ul>");	
		var status = "<li>" + STATE + ": ";
		if (leftplayer) status += "L " + leftplayer.getPlayerState();
		if (rightplayer) status += ", R " + rightplayer.getPlayerState();
		if (message) status += " - " + message
		status += "</li>";
		$("#debug").prepend(status);
	}
}


//-->