/*
 * VIDEO PLAYER FUNCTIONS
 * (c) 2011
 * code for video player and display
 *
 * - hide/show
 * - play/stop
 * - event / compatibility
 * 
 * Useful vars and handles:
 *  .videoPlayers : the entire video div, both players, not captions 
 *  #mp4Player : html5 video player (video tag)
 *
 */

// =====================
// VIDEO PLAYER METHODS
// note: these assume using the standard video.html block

	function hide_video() { 
		$(".videoPlayers").hide();
	}
	
	function display_video() { 
		$(".videoPlayers").show(); 
		$('.videoNavBar').show();
		//$('.videoPlayAreaDimmer').show();
		if (useMP4Player==true) { $('#flashPlayer').hide(); $('#html5Player').fadeIn(500); }
		else { $(mp4Player).hide(); $('#flashPlayer').fadeIn(500); }
		videoIsPlaying=true;
		adjust_bg_music(false);
	}
	
	function stop_video() { 
		videoIsPlaying=false;
		if (useMP4Player==true) { mp4Player.pause(); }
		//else { $("#flvembed").stop(); }
		else { $('#flashPlayer').remove(); }
	}

	function load_but_dont_play(videoObject) {
		var videoURL = "videos/" + videoObject.video;
		var videoVol = videoObject.volume;	
		if (!masterVolume) videoVol=0;
		//
		if (useMP4Player==true) {
			$('#flashPlayer').remove();
			mp4Player.src = videoURL; 
		} else {
			$('#html5Player').remove();
			$(flvTemplate).appendTo('.videoPlayers');
			var flashvar = "vidURL="+videoURL+"&vidVol="+videoVol;
			$("#flvobjectVars").attr("value", (flashvar) );
			$("#flvembed").attr("flashvars", (flashvar) );
		}
		//get_video_links_from_db(videoObject.videoID);
	}
	
	function loaded_now_play(videoObject) {
		if (useMP4Player==true) {
			mp4Player.load(); // req'd for the new video to load
			setTimeout(function(){ mp4Player.play(); }, 750); // buffer
		}
	}
	
	function set_video_paths_to(videoObject) { 
		currentVideo = videoObject.video; // deprecated
		if (useMP4Player==true) {
			reload_mp4player(videoObject);
		} else {
			reload_flvplayer(videoObject); 
		}
		//get_video_links_from_db(videoObject.videoID);
	}	
		
	function reload_flvplayer(videoObject) {
		var videoURL = "videos/" + videoObject.video;
		var videoVol = videoObject.volume;	
		if (!masterVolume) videoVol=0;
		$('#html5Player').hide();
		$('#flashPlayer').remove(); // just in case
		$('#html5Player').remove();
		//$('.videoPlayAreaDimmer, #Spinner').remove();
		$(flvTemplate).appendTo('.videoPlayers');
		// set vars
		var flashvar = "vidURL="+videoURL+"&vidVol="+videoVol;
		$("#flvobjectVars").attr("value", (flashvar) );
		$("#flvembed").attr("flashvars", (flashvar) );
	}
	
	function reload_mp4player(videoObject) {
		var videoURL = "videos/" + videoObject.video;
		var videoVol = videoObject.volume;
		if (!masterVolume) videoVol=0;
		//$('#html5Player').show();
		if (!mp4Player) { mp4Player = document.getElementById("html5Player"); }
		mp4Player.volume = videoVol/10; 
		//if (browser=="iOS") mp4Player.volume(videoVol/10);
		$(mp4Player).attr({ "volume":videoVol/10 });
		mp4Player.src = videoURL; 
		mp4Player.load(); // req'd for the new video to load
		//mp4Player.play();
		setTimeout(function(){ mp4Player.play(); }, 750); // buffer
	}


// ====================
// VIDEO PLAYER EVENTS

	function flv_eventListener(evt) {
		if (evt == "ended") { video_event_end(); }
		else if (evt=="playing") { video_event_playing(); }
		else if (evt=="buffering") { video_event_loading(); }
		//else if (evt == "loadeddata") { video_event_playing(); }
		//"ready", "playing", "paused", "buffering"
	}
	
	function mp4_eventListener() { 
		$('#html5Player').bind('ended', function() { video_event_end(); }); 
		$('#html5Player').bind('play', function() { video_event_playing(); }); 
		$('#html5Player').bind('progress', function() { video_event_loading });
		/*
		var vplayer = document.getElementById("html5Player");
		vplayer.addEventListener('loadstart', function() { trace("-- video load started"); });
		vplayer.addEventListener('progress', function() { trace("-- video loading"); });
		vplayer.addEventListener('loadeddata', function() { trace("-- video loaded"); });
		vplayer.addEventListener('play', function() { trace("-- video playing"); });
		vplayer.addEventListener('pause', function() { trace("-- video paused"); });
		vplayer.addEventListener("ended", function() { trace("-- video done"); });
		*/
	}
	
	function video_event_playing() { // optimize code
		$('#Spinner').stop(true,true).hide();
		$('.videoPlayers').css({"opacity":"1"});
	}
	function video_event_loading() { // buffering
		$('.videoPlayers').css({"opacity":"0.75"});
		$('#Spinner').stop(true,true).show();
	}
	function video_event_paused() { // pause
		$('#Spinner').stop(true,true).hide();
	}
	// video_event_end() can be defined on your video_page.js


// ============================
// VIDEO COMPATIBLITY

	/*
	function video_can_play(evt) {
		play_video(evt.target.videoObject.video);
	}
	*/
	
	function update_player_support() {
		//<variable> = <expression> ? <true clause> : <false clause>
		useMP4Player = isMP4Compatible ? true : false;
		useFlashPlayer = isMP4Compatible ? false : true;
		$('.debug').append("<BR/>> isMP4Compatible updated to " + isMP4Compatible + " (useMP4Player:"+useMP4Player+", useFlashPlayer:"+useFlashPlayer  +")" );
	}
		

	function video_fallback(videotag) {		
		var errorCode = get_video_error();		
		if (errorCode == 13) { // genuine "media not supported" error
			$("#mp4").remove();
			$("#html5Player").remove();
			isMP4Compatible=false; 
			useMP4Player=false;
			useFlashPlayer=true;
			$('#debug').append("<br/>// Video Fallback code: "+errorCode+ ". Media format not supported. useMP4Player=false" );		
		}
		else if (errorCode == 4) {
			if (currentVideo) { $('#debug').append("<br/>!! Video \""+currentVideo+"\" not found"); }
			else { $('#debug').append("<br/>No video specified."); }
		} else { 
			$('#debug').append("<br/>!! Video Fallback code: "+errorCode);		
		}
	}
	
// buffer

	function buffer_video(vid) {
		 var timer = 0;
		 //var vidPlayer = null;
		 //if (useMP4Player==true) { vidPlayer = html5Player }		 
		 html5Player.addEventListener('progress', function (e) {
			 if (this.buffered.length > 0) {		 
				 if (timer != 0) {
					 clearTimeout(timer);
				 }		 
				 timer = setTimeout(function () {            
					 if(parseInt(video.buffered.end() / video.duration * 100) == 100) {
						 // video has loaded.... 
					 };          
				 }, 1500);		 
			 }
		 }, false); 
	}


// =======================
// ERRORS //

	function get_video_error() {
		var errorCode; // get player error if any, or just the current state
		if (mp4Player.error) { 
			errorCode=mp4Player.error.code; // fatal errors
		} else { 
			errorCode=mp4Player.networkState + 10; // warnings
		}
		
		return errorCode;
	}
	
	function on_video_error(evt) { 
		// note: evt has no error info		
		//var errorCode; // get player error if any, or just the current state
		//if (mp4Player.error) { errorCode=mp4Player.error.code } else { errorCode=mp4Player.networkState; }
		var errorCode = get_video_error();
		if (errorCode==4) video_fallback();
		
		var errorStr =  "<BR>!!! Video Error: "+ errorCode;  //mp4Player.error.code;
		
		switch (errorCode) {
	    case 0: 
		  errorStr+=" Unknown error, or no error at all.";
		  break;
		case 1: 
		  errorStr+=(" Video aborted by user.");
		  break;
	    case 2:
		  errorStr+=(" Network error. Cannot connect");
		  break;
	    case 3: 
		  errorStr+=(" Error decoding. The file may be corrupt.");
		  break;
	    case 4: 
		  errorStr+=(" File type not found.");
		  break;
		  
		case 10: 
		  errorStr+=" Network empty.";
		  break;
		case 11: 
		  errorStr+=(" Network state is idle.");
		  break;
	    case 12:
		  errorStr+=(" Network still loading.");
		  break;
	    case 13: 
		  errorStr+=(" Network loading done.");
		  break;
	    case 14: 
		  errorStr+=(" Source not found.");
		  break;
	 	}
		$('#debug').append(errorStr);
	}
	
