// change these if needed
var streamer = "lighttpd";
var autostart = true;
var isplaying = true;
var firstrun = false;
var bufferlength = 15;
var videoplayerwidth = 560; // width of ppt video
var videoplayerheight = 420; // height of ppt video
var speakerplayerwidth = 260; // width of speaker video
var speakerplayerheight = 195; // height of speaker video
var loadTwoPlayers = true;
var allowfullscreen = false;
var debug = false;
var currentSlide = 1; // index of current slide (start with 1 for first slide)
var currentSlideIndex = 0; // index of current slide (array index, start with 0)
var totalSlides = 0; // number of total available slides

// player ids
var videoplayerid = "videoplayer";
var speakerplayerid = "speakerplayer";

// player videos (set in layout)
var videoplayerfile = null;
var speakerplayerfile = null;

// configuration passed to player
var videoflashvars = null;
var speakerflashvars = null;

// do not change!
var allmostdone = false;
var videoplayer = null;
var speakerplayer = null;
var s1 = null;
var s2 = null;
var debugdiv1 = null;
var debugdiv2 = null;
var currentSlideDiv = null;
var sheets = null;
var videoinit = false;
var speakerinit = false;
var timeout = null;
var starttime = 0;

var sheets = null

/*
 * initialize players
 */
function initPlayers(path) {
	videoflashvars = "&id=" + videoplayerid + "&controlbar=none&file=" + videoplayerfile + "&bufferlength=" + bufferlength + "&streamer=" + streamer + "&start=" + starttime;
	speakerflashvars = "&id=" + speakerplayerid + "&controlbar=none&file=" + speakerplayerfile + "&bufferlength=" + bufferlength + "&streamer=" + streamer + "&start=" + starttime + "&displayclick=none";

	videoflashvars += "&autostart=" + (autostart ? "true" : "false");
	speakerflashvars += "&autostart=" + (autostart ? "true" : "false");
	
	// embed player
	s1 = new SWFObject(path + "player.swf", videoplayerid, videoplayerwidth, videoplayerheight, "9", "#FFFFFF");
	s1.addParam("allowfullscreen", allowfullscreen);
	s1.addParam("allowscriptaccess", "always");
	s1.addParam("wmode", "transparent"); // allow css to be put over flash element
	s1.addParam("flashvars", videoflashvars);
	s1.write("videocontainer");

	if(loadTwoPlayers) {
		s2 = new SWFObject(path + "player.swf", speakerplayerid, speakerplayerwidth, speakerplayerheight, "9", "#FFFFFF");
		s2.addParam("allowfullscreen", allowfullscreen);
		s2.addParam("allowscriptaccess", "always");
		s2.addParam("wmode", "transparent"); // allow css to be put over flash element
		s2.addParam("flashvars", speakerflashvars);
		s2.write("speakercontainer");
	}

	firstrun = true;
}

/*
 * change to specific timestamp (in seconds)
 */
function changePos(s) {
	//playerCmd("stop");

	// THERE SEEMS TO BE A BUG IN lighttpd STREAMING - VIDEOS START AT DIFFERENT TIME INTERVALLS!

	changeCurrentSlide(s);

	/*
	// speakervideo starts bufferlength too early
	s1.addParam("flashvars", videoflashvars + "&start=" + s + "&autostart=" + autostart);
	s1.write("videocontainer");

	if(speakerplayer != null) {
		s2.addParam("flashvars", speakerflashvars + "&start=" + s + "&autostart=" + autostart);
		s2.write("speakercontainer");
	}
	*/

	videoplayer.sendEvent("SEEK", s);
	if(speakerplayer != null)
		speakerplayer.sendEvent("SEEK", s);
}

/*
 * players completely initialized?
 */
function playerReady(obj) {
	var id = obj['id'];
	if(id != null && typeof id != undefined) {
		var tmp = document.getElementById(id);
		if(id == videoplayerid)
			videoplayer = tmp;
		else if(id == speakerplayerid)
			speakerplayer = tmp;
	} else { // Linux: should not be reached since set in flashvars
		videoplayer = document.getElementById(videoplayerid);
		speakerplayer = document.getElementById(speakerplayerid);
	}

	// subscribe listeners
	if(videoplayer != null) {
		videoplayer.addControllerListener("PLAY", "playerPlayPauseChanged");
		videoplayer.addControllerListener("STOP", "playerStopChanged");
		videoplayer.addControllerListener("VOLUME", "volumeListener");
		videoplayer.addModelListener("BUFFER", "playerBufferChanged");
		videoplayer.addModelListener("STATE", "playerStateChanged");
		videoplayer.addModelListener('TIME',  'timeMonitor');
		videoinit = true;
	}
	if(speakerplayer != null) {
		speakerplayer.addModelListener("BUFFER", "speakerBufferChanged");
		speakerplayer.addModelListener("STATE", "speakerStateChanged");
		speakerplayer.addModelListener('TIME',  'timeMonitor2');
		speakerinit = true;
	}

	timeout = setTimeout("checkFirstRun()", 100);
}

/*
 * synchronize both players and let them preload
 */
function checkFirstRun() {
	// stop automatic playback on the first run
	if(firstrun) {
		if(loadTwoPlayers && videoinit && speakerinit) {
			//speakerplayer.sendEvent("PLAY", "false");
			//videoplayer.sendEvent("PLAY", "false");
			firstrun = false;
		} else if(!loadTwoPlayers && videoinit) {
			//videoplayer.sendEvent("PLAY", "false");
			firstrun = false;
		}
	}

	if(!firstrun) {
		clearTimeout(timeout);
		setTimeout("", 600);
		playerCmd("play");
		changePos(0);
	}
}

/*
 * change Play/Pause image
 */
function changeImage() {
	var e = document.getElementById("playpauseimg");
	e.src = e.src.substring(0, e.src.length - 9) + (isplaying ? "pause.jpg" : "play2.jpg");
}

/*
 * send command to Flash player
 */
function playerCmd(action) {
	var volume = parseInt(videoplayer.getConfig().volume);

	switch(action) {
		case 'play':
		case 'pause':
			var tmp = isplaying ? "false" : "true";
			changeImage();
			isplaying = !isplaying;

			videoplayer.sendEvent("PLAY", tmp);
			if(speakerplayer != null)
				speakerplayer.sendEvent("PLAY", tmp);
			break;
		case 'stop':
			videoplayer.sendEvent("STOP");
			if(speakerplayer != null)
				speakerplayer.sendEvent("STOP");
			break;
		case 'volume_down': // only one video has sound
			if((volume - 10) > 0)
				volume -= 10;
			else
				volume = 0;
			videoplayer.sendEvent("VOLUME", volume);
			break;
		case 'volume_up': // only one video has sound
			if((volume + 10) > 100)
				volume = 100;
			else
				volume += 10;
			videoplayer.sendEvent("VOLUME", volume);
			break;
		case 'first_slide':
			changeToSlideIndex(0);
			break;
		case 'last_slide':
			changeToSlideIndex((totalSlides - 1));
			break;
		case 'next_slide':
			changeToSlideIndex((currentSlideIndex + 1));
			break;
		case 'previous_slide':
			changeToSlideIndex((currentSlideIndex - 1));
			break;
	}
}

function playerPlayPauseChanged(obj) {
	var playing = obj["state"]; // true if playing, otherwise false
	isplaying = playing;
	changeImage();
	if(speakerplayer != null)
		speakerplayer.sendEvent("PLAY", (playing ? "true" : "false"));
}

function playerStopChanged() {
	// player was stopped
	// alert("STOPPED!");
}

function volumeListener(obj) {
	//alert(obj.percentage);
}

function playerBufferChanged(obj) {
	var percentage = obj["percentage"];

	// document.getElementById("buffer").innerHTML = "buffer: " + percentage;

	if(percentage >= 60 && videoplayer.getConfig().state == "BUFFERING" && !allmostdone) {
		allmostdone = true;
	}
}

function playerStateChanged(obj) {
	var newstate = obj["newstate"];
	var oldstate = obj["oldstate"];

	// document.getElementById("status").innerHTML = "state: " + newstate;

	if(newstate == "PLAYING" && allmostdone) {
		allmostdone = false;
		playerCmd("pause");
		bothPlayersReady();
	}
}

function speakerBufferChanged(obj) {
	var percentage = obj["percentage"];
}

function speakerStateChanged(obj) {
	var newstate = obj["newstate"];
	var oldstate = obj["oldstate"];

	// document.getElementById("status").innerHTML = "state: " + newstate;

	// wait for other player to become ready
	if(newstate == "PLAYING" && videoplayer.getConfig().state == "BUFFERING") {
		playerCmd("pause");
		bothPlayersReady();
	}
}

function bothPlayersReady() {
	var paused = videoplayer.getConfig().state == "PAUSED";

	if(speakerplayer != null && paused) {
		paused &= (speakerplayer.getConfig().state == "PAUSED");
	}

	if(paused) {
		playerCmd("play");
	}
}

/*
function dump(obj) {
	for(var i in obj) {
		alert(i + " = " + obj[i]);
	}
}
*/

function doSleep(delay) {
	var start = new Date().getTime();
	while(new Date().getTime() < start + delay);
}

function SlideEffect(id) {
	var container = document.getElementById(id);
	var content = document.getElementById(id + '_content');

	var width = 0;
	var size = 0;
	var offset = 0;
	var max_offset = 0;
	
	init();
	
	function init() {
		width = container.offsetWidth;
		size = container.scrollWidth;
		max_offset = size > width ? size - width : 0;
	}
	
	function setOffset(px) {
		offset = px;
		if (offset < 0) offset = 0;
		if (offset > max_offset) offset = max_offset;
		content.style.marginLeft = (-offset) + 'px';
	}
	
	this.slideBy = function(px) {
		setOffset(offset + px);
	}
	
	this.slideToBegin = function() {
		setOffset(0);
	}
	
	this.slideToEnd = function() {
		setOffset(max_offset);
	}
	
	this.slideToElement = function(id, force_center) {
		var all = content.getElementsByTagName('img');
		for (var i = 0; i < all.length; i++) {
			all[i].className = '';
		}
	
		var e = document.getElementById(id);
		e.className = 'active';

		/* skip moving to current slide		
		if (force_center || e.offsetLeft < 0 || e.offsetLeft > width - e.offsetWidth) {
			this.slideBy(e.offsetLeft - Math.round(width / 2 - e.offsetWidth / 2));
		}
		*/
	}
}

function timeMonitor(obj) {
	if(debug) {
		if(debugdiv1 == null || typeof debugdiv1 == undefined)
			debugdiv1 = document.getElementById('debug1');
		debugdiv1.innerHTML = "[present] At " + obj.position;
	}

	if(firstrun && obj.position > 0) {
		//alert("b:video at " + obj.position + " with state " + videoplayer.getConfig().state);
		videoplayer.sendEvent("PLAY", "false");
		//alert("a:video at " + obj.position + " with state " + videoplayer.getConfig().state);
	}
	changeCurrentSlide(obj.position);
}

function timeMonitor2(obj) {
	if(debug) {
		if(debugdiv2 == null || typeof debugdiv2 == undefined)
			debugdiv2 = document.getElementById('debug2');
		debugdiv2.innerHTML = "[speaker] At " + obj.position;
	}
	if(firstrun && obj.position > 0) {
		//alert("b:speaker at " + obj.position + " with state " + speakerplayer.getConfig().state);
		speakerplayer.sendEvent("PLAY", "false");
		//alert("a:speaker at " + obj.position + " with state " + speakerplayer.getConfig().state);
	}
}

function changeCurrentSlide(timeindex) {
	var nextslide = 0;
	for(var index = 0; index < sheetsdata.length; index++) {
		if(index + 1 < sheetsdata.length) {
			if(timeindex >= sheetsdata[index].timeindex && timeindex < sheetsdata[index + 1].timeindex) {
				currentSlide = sheetsdata[index].sheet;
				currentSlideIndex = index;
				index = sheetsdata.length;
				break;
			}
		} else if(index + 1 >= sheetsdata.length) {
			// last slide
			currentSlide = totalSlides;
			currentSlideIndex = currentSlide - 1;
			index = sheetsdata.length;
			break;
		}
	}

	updateCurrentSlide();
	sheets.slideToElement('sheet_' + currentSlide);
}

function updateCurrentSlide() {
	if(currentSlideDiv == null)
		currentSlideDiv = document.getElementById('currentslide');
	currentSlideDiv.innerHTML = currentSlide;
}

function changeToSlideIndex(index) {
	var timeindex = sheetsdata[index].timeindex;
	changePos(timeindex);
}

function fillSheetsData(path) {
	var data = "";
	var cursheet = "";
	for(var index = 0; index < sheetsdata.length; index++) {
		cursheet = "sheet_" + sheetsdata[index].sheet;
		data += "<a href=\"javascript:sheets.slideToElement('sheet_" + sheetsdata[index].sheet + "');changePos(" + sheetsdata[index].timeindex + ");\">";
		data += "<img src=\"" + path + sheetsdata[index].file + "\" id=\"" + cursheet + "\" alt=\"" + cursheet + " - " + sheetsdata[index].timecode + "\" />";
		data += "</a>\n";
		totalSlides = sheetsdata[index].sheet;
	}
	document.getElementById('sheets_content').innerHTML = data;
	updateCurrentSlide();
	document.getElementById('totalslides').innerHTML = totalSlides;
}

function loadComplete() {
	if(FlashDetect.installed && FlashDetect.versionAtLeast(9, 0, 115)) {
		document.getElementById('loader').style.display = 'none';
		var e = document.getElementById("playpauseimg");
		e.src = e.src.substring(0, e.src.length - 9) + "pause.jpg";
		playerCmd("play");
		if(!autostart) playerCmd("pause");
	} else {
		var msg = "<span style='color:red;font-weight:bold'><p>ERROR</p></span><p>You need at least Flash v9.0.115 to view this page!<br/>Please go to the <a href=\"http://www.adobe.com/de/products/flashplayer/\" target=\"_blank\">Adobe Flash Player Website</a> and download the latest version!</p>";
		document.getElementById('loadercontent').innerHTML = msg;
	}
}