$(document).ready(function(){
	
	fallBack = (!supports_video()) ? true : false;
	if (fallBack==false) video = detectVideoSupport();

	initVideo();
	initVideoFallback();
});

var video;
var showProgress = true;
var videoElem;
var players = new Array();
var playButton;
var aspect = 4/3;
var defaultHeight = 150;
var upScale = 2;

var fallBack = true;

function supports_video() {
	return !!document.createElement('video').canPlayType;
}

var detectVideoSupport = function () {
	var detect = document.createElement('video') || false;
	this.html5 = detect && typeof detect.canPlayType !== "undefined";
	this.mp4 = this.html5 && (detect.canPlayType("video/mp4") === "maybe" || detect.canPlayType("video/mp4") === "probably");
	this.ogg = this.html5 && (detect.canPlayType("video/ogg") === "maybe" || detect.canPlayType("video/ogg") === "probably");
	return this;
};
 
var replaceFirefoxVideoWithChildObject = function (video_id) {    
	if(!video_id){ return false; }
	//alert(video_id);
	videoElem = document.getElementById(video_id);
	if(videoElem){
		var obj = videoElem.getElementsByTagName('object')[0];
		if(obj){
			var obj_copy = obj.cloneNode(true);
			videoElem.parentNode.insertBefore(obj_copy, videoElem);
			videoElem.parentNode.removeChild(videoElem);
		}
	}
};
 
function getPlayButton(videoElem) {
	return videoElem.parentNode.getElementsByTagName('a')[1];
}

function startedPlaying() {
	
	//alert('playing');
	playButton = getPlayButton(this);
	//alert(playButton.id);
	$(playButton).removeClass('loading').removeClass('play').addClass('pause');
}

function stoppedPlaying() {
	
	playButton = getPlayButton(this);
	//alert(playButton.id);
	$(playButton).removeClass('loading').removeClass('pause').addClass('play');
}

function waiting (ev) {
	//if (!showProgress) {
	//	showProgress = true;
		playButton = getPlayButton(this);
		$(playButton).removeClass('play').removeClass('pause').addClass('loading');
	//}
}

function loadRequired() {
	if ("DATA_UNAVAILABLE" in HTMLMediaElement)
		return videoElem.readyState == HTMLMediaElement.DATA_UNAVAILABLE;
	if ("HAVE_NOTHING" in HTMLMediaElement)
		return videoElem.readyState == HTMLMediaElement.HAVE_NOTHING;
	return false
}

function canPlayThrough() {
	if ("CAN_PLAY_THROUGH" in HTMLMediaElement)
		return videoElem.readyState == HTMLMediaElement.CAN_PLAY_THROUGH;
	if ("HAVE_ENOUGH_DATA" in HTMLMediaElement)
		return videoElem.readyState == HTMLMediaElement.HAVE_ENOUGH_DATA;
	return false
}

function initVideo() {

	// clean up after firefox, and remove video elements
	$('div.video > video').each(function(index, videoElem) {

		//Both Opera and firefox support ogg but lack MP4 support
		if (!video.mp4 && video.ogg) {
			//Only Firefox fails to support Flash Fallback
			if (navigator.userAgent.indexOf('Firefox') !== -1) {
				fallBack = true;
				replaceFirefoxVideoWithChildObject(videoElem.id);
			}
		}
	});

	//alert(fallBack);

	// set up video element event listeners
	if (fallBack==false) $('div.video > video').each(function(index, videoElem) {

		/* if (!videoElem.play) {
			playButton = getPlayButton(this);
			playButton.style.display = 'none';
			return;
		} */
		videoElem.addEventListener('play', startedPlaying, true);
		videoElem.addEventListener('pause', stoppedPlaying, true);
		videoElem.addEventListener('ended', function () {
			if (!this.paused) this.pause();
			stoppedPlaying();
		}, true);
		/* videoElem.addEventListener("canplaythrough", function () {
			this.play();
		});
		videoElem.addEventListener("error", function() {
		    playButton = getPlayButton(this);
		    playButton.innerHTML = "Load failed";
		}); */
		videoElem.addEventListener('waiting', waiting, true);
		videoElem.addEventListener('dataunavailable', waiting, true);
	});


	// setup clicks for video elements on front div
	$('div.video > div.click').click( function() {
		
		var videoElem = this.parentNode.getElementsByTagName('video')[0];
		
		/* var videoElem;
		if (!fallBack) videoElem = this.parentNode.getElementsByTagName('video')[0];
		else videoElem = this.parentNode.getElementsByTagName('object')[0]; */

		if (fallBack) {
			//videoElem = this.parentNode.getElementsByTagName('span')[0];
			videoElem = this.parentNode.getElementsByTagName('object')[0];
			//videoElem = document.getElementById(videoElem.id);
			//alert(videoElem.id);
		}
		
		var poster = this.parentNode.getElementsByTagName('img')[0];
		if (! $(poster).hasClass('hide') ) {
			$(poster).addClass('hide');
			$(videoElem).removeClass('hide');
		}
		
		maxHeight = $(window).height() - (220 + 30);
		videoHeight = this.parentNode.style.height;
		//alert(videoHeight);
		if (videoHeight=='' || videoHeight==defaultHeight+'px') {

			resetVideoZoom();
			resetImgZoom();
			
			this.parentNode.style.width = maxHeight*aspect+'px';
			this.parentNode.style.height = maxHeight+'px';
			
			$('#gallery').addClass('expanded');

			if (!fallBack) videoElem.play();
			else if (videoElem.sendEvent) videoElem.sendEvent('PLAY', 'true');
			//$f(this).play();
			
		} else {
			
			//alert(fallBack);
			
			setDefaultSize(this.parentNode);
			
			$('#gallery').removeClass('expanded');
			
			if (!fallBack) videoElem.pause();
			else if (videoElem.sendEvent) videoElem.sendEvent('PLAY', 'false');
			//$f(this).pause();
		}
	});
	

	// video controls
	$('div.video > a.playbutton').click( function () {
		
		var poster = this.parentNode.getElementsByTagName('img')[0];
		var videoElem = this.parentNode.getElementsByTagName('video')[0];
		if (videoElem==null) {
			fallBack = true;
			//html5media();
			//videoElem = $f(this.parentNode.getElementsByTagName('span')[0].id);
			videoElem = this.parentNode.getElementsByTagName('object')[0];
		}
		
		if (! $(poster).hasClass('hide') ) {
			$(poster).addClass('hide');
			$(videoElem).removeClass('hide');
		}
	
	    if (!fallBack) {
		    if (videoElem.paused) {
/*				if (loadRequired())
					videoElem.load();
				if (canPlayThrough()) */
					videoElem.play();
		    } else {
				videoElem.pause();
			}

		} else {
		
			/*
if (videoElem.sendEvent) {
				if ( $(this).hasClass('play') ) {
					videoElem.sendEvent('PLAY', 'false');
					//$(this).removeClass('loading').removeClass('play').addClass('pause');
				} else {
					videoElem.sendEvent('PLAY', 'true');
					//$(this).removeClass('loading').removeClass('pause').addClass('play');
				}
			}
*/
		}
	
	});	
	
}


function playerReady(obj) {

	//alert('the videoplayer '+obj['id']+' has been instantiated');

	//videoElem = document.getElementById(obj.id);
	//videoElem.addModelListener('STATE', 'stateListener');
	
	document.getElementById(obj.id).addModelListener('STATE', 'stateListener');
}


function stateListener(obj) {

	if (obj.newstate == 'PLAYING') {
		//alert(obj.id+' is playing');
		
		var playButton = getPlayButton(obj);
		//alert(playButton.id);
		$(playButton).removeClass('loading').removeClass('play').addClass('pause');

		/*
$(playButton).click( function () {
			obj.sendEvent('PLAY', 'false');
		} );
*/
		
	} else {
		//alert(obj.id+' is paused');
		
		var playButton = getPlayButton(obj);
		//alert(playButton.id);
		$(playButton).removeClass('loading').removeClass('pause').addClass('play');
/*
		$(playButton).click( function () {
			obj.sendEvent('PLAY', 'true');
		} );
*/
	}
	
}


function initVideoFallback() {
	
	// set up playback state event listeners for fallback video elements
	$('div.video > object').each(function(index, videoElem) {

		//alert(videoElem.id);

		// disable clicks
		/*
$f(videoElem.id).onBeforePause( function() {
			return false;
		});	

		$f(videoElem.id).onStart(function() {
			alert('play');
			//startedPlaying();
		});
		
		$f(videoElem.id).onPause(function() {
			alert('stop'); 
			//stoppedPlaying();
		});
*/
		
	});

}


function resetVideoZoom() {

	if(!fallBack) {

		$('div.video > video').each(function(index, videoElem) {
			
			setDefaultSize(videoElem.parentNode);
			videoElem.pause();
		});
	
	} else {
	
		$('div.video > object').each(function(index, videoElem) {
		
			setDefaultSize(videoElem.parentNode);
			if (videoElem.sendEvent) videoElem.sendEvent('PLAY', 'false');
			//$f(videoElemSpan.id).pause();	
		});
	
	}
}


function setDefaultSize(obj) {

	obj.style.width = defaultHeight*aspect+'px';
	obj.style.height = defaultHeight+'px';
}
