// YouTube Chromeless Player with Google Analytics Event Tracking
// Made by Eivind Savio 2008
// http://www.savio.no
// Explanation of this YouTube Chromeless Player can be found at
// http://www.savio.no/blogg/a/53/youtube-chromeless-player-with-google-analytics-event-tracking

// Event Tracking is based on a blog post by Justin Cutroni, Analytics Talk
// http://www.epikone.com/blog/2008/07/29/tracking-youttube-videos-with-google-analytics/

// For information about the YouTube Chromeless Player, see 
// http://code.google.com/apis/youtube/chromeless_player_reference.html
// and the API reference
// http://code.google.com/apis/youtube/js_api_reference.html

// For information about Google Analytics Event Tracking, see
// http://code.google.com/apis/analytics/docs/eventTrackerOverview.html

// Volume slider is based on a script from Arantius.com
// http://programming.arantius.com/lightweight+javascript+slider+control

// This code is provided As Is with no warranty expressed or implied. 
// I am not liable for anything that results from your use of this code.

var ytpEventTracker = pageTracker._createEventTracker("YouTube Video Player");
var eventLabel;
var nowPlaying;
var ytplayer;


function embedPlayer() {
// Hack for playing embedded YouTube videos in high quality. I do not guarantee that the use of this solution will work in the future.
var VideoQuality= document.getElementById('VideoQuality').value;
var ytQuality = '&amp;ap=%2526fmt%3D18';
	if (VideoQuality == 'high') {
		ytQuality = ytQuality;
	} else {
 		ytQuality = '';
}
//High Quality Video code end
    var params = { allowScriptAccess: 'always', bgcolor: '#D5DDB3' };
    var atts = { id: 'myytplayer' };
    swfobject.embedSWF('http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=ytplayer' + ytQuality, 
            'ytapiplayer', '463', '365', '8', null, null, params, atts);
}

function updateHTML(elmId, value) {
	document.getElementById(elmId).innerHTML = value;
}

function setytplayerState(newState) {
		if (translateYTPState(newState) == 'ended' && parseInt(getCurrentTime()) > 0) { 
		recordEnd(eventLabel,parseInt(getCurrentTime()));
		}
}

function onYouTubePlayerReady(playerId) {
	ytplayer = document.getElementById('myytplayer');
	setInterval(updateytplayerInfo, 250);
	updateytplayerInfo();
	ytplayer.addEventListener('onStateChange', 'onytplayerStateChange');
		document.getElementById('controls').style.display = 'block';
	// Google Analytics Event Tracking
	//ytpEventTracker._trackEvent("Video Player Loaded", eventLabel);
}


function onytplayerStateChange(newState) {
	setytplayerState(newState);
}

function translateYTPState(state) {
	switch (state) {
		case -1: return "unstarted";
		case 0 : return "ended";
		case 1 : return "playing";
		case 2 : return "paused";
		case 3 : return "buffering";
		case 5 : return "video cued";
	}
	return;
}

function onPlayerError(errorCode) {
	alert("An error occurred: "+ errorCode);
		//Google Analytics Event Tracking
		//ytpEventTracker._trackEvent("Error: " + errorCode, eventLabel);
}
	
function startTheShow(id) {
	loadNewVideo(id);
	HideContent('VideoStart');
	ShowContent('VideoForward');
	ShowContent('VideoRewind');
	ShowContent('VideoMute');
	ShowContent('VideoPause');
	ShowContent('timebarIndicator');
	ytplayer.unMute();
}


function loadNewVideo(id) {
	if (ytplayer) {
		currentid = id;
		ytplayer.loadVideoById(id);
		HideContent('VideoStart');
		HideContent('VideoPlay');
		ytplayer.unMute();
		HideContent('VideoUnMute');
		ShowContent('VideoForward');
		ShowContent('VideoRewind');
		ShowContent('VideoMute');
		ShowContent('VideoPause');
		ShowContent('timebarIndicator');
		}
}

function setStart() {
	HideContent('VideoPlay');
	HideContent('VideoForward');
	HideContent('VideoRewind');
	HideContent('VideoMute');
	HideContent('VideoUnMute');
	HideContent('VideoPause');
	HideContent('timebarIndicator');
}

function cueNewVideo(id) {
	if (ytplayer) {
		ytplayer.cueVideoById(id);
	}
}

function startNewVideo () {
// if there is a current video playing, record the end
	var oldTime = parseInt(getCurrentTime());
	var oldEventLabel = eventLabel;

	if (oldTime > 0) { 
		recordEnd(oldEventLabel, oldTime);
	}	
		eventLabel = (document.getElementById('loadvideoname').value);
		loadNewVideo(document.getElementById('loadvideoid').value);
		//ytpEventTracker._trackEvent("Video - Started", eventLabel);
	  		//Hiding/showing content on the video HTML page and unmuting the player when the video starts.
}

function getBytesLoaded() {
	if (ytplayer) {
		return ytplayer.getVideoBytesLoaded();
	}
}

function getBytesTotal() {
	if (ytplayer) {
		return ytplayer.getVideoBytesTotal();
	}
}

function getCurrentTime() {
	if (ytplayer) {
		return ytplayer.getCurrentTime();
	}
}

function getDuration() {
	if (ytplayer) {
		return ytplayer.getDuration();
	}
}

function recordEnd(l,t) {
	//Reset Play/Pause button when video ends
	HideContent('VideoPause');
	ShowContent('VideoPlay');
	//Google Analytics Event Tracking
	//ytpEventTracker._trackEvent("Video - Ended", l, parseInt(t));
}

function play() {
	if (ytplayer) {
		ytplayer.playVideo();
			//Google Analytics Event Tracking
			//ytpEventTracker._trackEvent("Video - Play",eventLabel);
	}
		//Not part of the original YouTube or Event Tracking code. Hiding/showing content on the video HTML page.
		ShowContent('VideoPause');
		HideContent('VideoPlay');
}

function pause() {
	if (ytplayer) {
		ytplayer.pauseVideo();
		//Google Analytics Event Tracking		
		//ytpEventTracker._trackEvent("Video - Pause",eventLabel);
	}
		//Hiding/showing content on the video HTML page.	
		ShowContent('VideoPlay');
		HideContent('VideoPause');
}
		
function stop() {
if (ytplayer) {
	//Google Analytics Event Tracking
	//ytpEventTracker._trackEvent("Video - Stop",eventLabel,parseInt(getCurrentTime()));
	ytplayer.stopVideo();
	}
		//Hiding/showing content on the video HTML page.	
		ShowContent('ytimage');
		HideContent('ytapiplayer');
}	

function getPlayerState() {
	if (ytplayer) {
		return ytplayer.getPlayerState();
	}
}

// FORWARD
function fwd(fwdSeconds, allowSeekAhead) {
	if (ytplayer) {
	var fwdSeconds = getCurrentTime()+10;
	ytplayer.seekTo(fwdSeconds);
		//Google Analytics Event Tracking
		//ytpEventTracker._trackEvent("Video - Forward",eventLabel);
	}
}

// REWIND
function rwd(rwdSeconds) {
	if (ytplayer) {
	var rwdSeconds = getCurrentTime()-10;
	ytplayer.seekTo(rwdSeconds);
		//Google Analytics Event Tracking
		//ytpEventTracker._trackEvent("Video - Rewind",eventLabel);
	}
}

function getStartBytes() {
	if (ytplayer) {
		return ytplayer.getVideoStartBytes();
	}
}

// MUTE
function mute() {
	if (ytplayer) {
		ytplayer.mute();
		//Google Analytics Event Tracking
		//ytpEventTracker._trackEvent("Video - Mute",eventLabel);
	}
		//Not part of the original YouTube Event Tracking code. Hiding/showing content on the video HTML page.
		ShowContent('VideoUnMute');
		HideContent('VideoMute');
}

// UNMUTE
function unMute() {
	if (ytplayer) {
		ytplayer.unMute();
		//Google Analytics Event Tracking
		//ytpEventTracker._trackEvent("Video - Unmute",eventLabel);
	}
		//Hiding/showing content on the video HTML page.	
		ShowContent('VideoMute');
		HideContent('VideoUnMute');
}	
		
// Volume slider. //Not part of the original YouTube or Event Tracking code. The slider code is working together with slider.js
var slider=new Array();
	slider[1]=new Object();
	slider[1].min=0;
	slider[1].max=100;
	slider[1].slidervalue=70;
	slider[1].onchange=setSliderValue;
function setSliderValue(slidervalue) {
	var b=document.getElementById('output1');
	slidervalue=Math.round(slidervalue*1000)/1000;
	b.value=Math.round(slidervalue);

	if (ytplayer) {
		ytplayer.setVolume(slidervalue);
	}
}
		
function getVolume() {
	if (ytplayer) {
		return ytplayer.getVolume();
	}
}

//Calculating time so time less than 10 are shown with a 0 in front, ex. 09.		
function splitTime(a)
	{
		var tm=new Date(a*1000)
		var hours=Math.round(tm.getUTCHours());
		var minutes=Math.round(tm.getUTCMinutes());
		var seconds=Math.round(tm.getUTCSeconds()); 

	if (hours > 0){
		timeStr= "" + hours;
		timeStr+= ((minutes < 10) ? ":0" : ":") + minutes;
		timeStr+= ((seconds < 10) ? ":0" : ":") + seconds;
	}
	else{
		timeStr= "";
		timeStr= ((minutes < 10) ? "0" : ":") + minutes;
		timeStr+= ((seconds < 10) ? ":0" : ":") + seconds;
		} 
	
return timeStr
} 

function updateytplayerInfo() {
    if (ytplayer) {
        updateTimebar();
		updateBytesbar();
        updateHTML("videoduration", splitTime(getDuration()));
        updateHTML("videotime", splitTime(getCurrentTime()));
		time = getCurrentTime();
		dur = getDuration();
		dur = dur - 1;
		if((time > dur) && dur> 1 && time > 1){
			//stop();
			getNextPlaylist();
			}
	}
}

function updateTimebar() {
    var all = ytplayer.getDuration();
    var part = ytplayer.getCurrentTime();
    var percent = getPercent1(all, part);
    var timebarWidth = 100;
    document.getElementById('timebarIndicator').style.left = percent * (timebarWidth / 100) + "%";
}

function updateBytesbar() {
    var all = ytplayer.getVideoBytesTotal();
    var partBytes = ytplayer.getVideoBytesLoaded();
    var percentBytes = getPercent2(all, partBytes);
    var bytesbarWidth = 100;
    document.getElementById('bytesbarIndicator').style.width = percentBytes * (bytesbarWidth / 100) + "%";
}

function getPercent1(all, part) {
	return (all > 0) ? (100 / all) * part : 0;
}

function getPercent2(all, partBytes) {
	return (all > 0) ? (100 / all) * partBytes : 0;
}

function clearVideo() {
	if (ytplayer) {
		ytplayer.clearVideo();
	}
}


// Show/hide content on the video HTML page. Not part of the YouTube or Google Analytics Javascript
function HideContent(d) {
	if(d.length < 1) { return; }
		document.getElementById(d).style.display = "none";
}
function ShowContent(d) {
	if(d.length < 1) { return; }
		document.getElementById(d).style.display = "block";
}
function ReverseContentDisplay(d) {
	if(d.length < 1) { return; }
	if(document.getElementById(d).style.display == "none") { document.getElementById(d).style.display = "block"; }
	else { document.getElementById(d).style.display = "none"; }
}

var timer;
var i =0;
var youtubediv = new Array();

var normalplayer = false;
var currentid = 0;
var size = 1;

function getNextPlaylist(){
		var playlistplay = 0;
		var ul = document.getElementById("tvlist");
          var items = ul.getElementsByTagName("li");
            for (i=0;i<items.length;i=i+1) {
                if(items[i].id == currentid){
					var p=i+1;
					if(items[p]){
						playlistplay = 1;
						loadNewVideo(items[p].id);
						break;
					}
				}
            }

			//get playlist if its filled
			if(playlistplay == 0 && items.length > 0)
				loadNewVideo(items[0].id);

	}

	var imname;
	var timer;
	function mousOverImage(name,id,nr){
		if(name)
			imname = name;
		imname.src = "http://img.youtube.com/vi/"+id+"/"+nr+".jpg";
		nr++;
		if(nr > 3)
			nr = 1;
		timer =  setTimeout("mousOverImage(false,'"+id+"',"+nr+");",1000);

	}

	function mouseOutImage(name){
		if(name)
			imname = name;
		if(timer)
			clearTimeout(timer);
	}
	
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

	Originally from:
	http://programming.arantius.com/lightweight+javascript+slider+control

	Copyright (c) 2006 Anthony Lieuallen, http://www.arantius.com/

	Permission is hereby granted, free of charge, to any person obtaining a copy of 
	this software and associated documentation files (the "Software"), to deal in 
	the Software without restriction, including without limitation the rights to 
	use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 
	the Software, and to permit persons to whom the Software is furnished to do so, 
	subject to the following conditions:

	The above copyright notice and this permission notice shall be included in all 
	copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 
	FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 
	COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
	IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
	CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	//add event function from http://www.dynarch.com/projects/calendar/
	function addAnEvent(el, evname, func) {
	    if (el.attachEvent) { // IE
	        el.attachEvent("on" + evname, func);
	    } else if (el.addEventListener) { // Gecko / W3C
	        el.addEventListener(evname, func, true);
	    } else {
	        el["on" + evname] = func;
	    }
	}

	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function drawSliderByVal(slider) {
		var knob=slider.getElementsByTagName('span')[0];
		var pSlider=(slider.slidervalue-slider.min)/(slider.max-slider.min);
		var xSlider=(slider.scrollWidth-6)*pSlider;
		knob.style.width=xSlider+"px";
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function setSliderByClientX(slider, clientX) {
		var pSlider=(clientX-slider.offsetLeft-0)/(slider.scrollWidth-6);
		slider.slidervalue=(slider.max-slider.min)*pSlider + slider.min;
		if (slider.slidervalue>slider.max) slider.slidervalue=slider.max;
		if (slider.slidervalue<slider.min) slider.slidervalue=slider.min;

		drawSliderByVal(slider);
		slider.onchange(slider.slidervalue, slider.num);
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function sliderClick(e) {
		var el=sliderFromEvent(e);
		if (!el) return;

		setSliderByClientX(el, e.clientX);
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function sliderMouseMove(e) {
		var el=sliderFromEvent(e);
		if (!el) return;
		if (activeSlider<0) return;

		setSliderByClientX(el, e.clientX);
		stopEvent(e);
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function sliderFromEvent(e) {
		if (!e && window.event) e=window.event;
		if (!e) return false;

		var el;
		if (e.target) el=e.target;
		if (e.srcElement) el=e.srcElement;

		if (!el.id || !el.id.match(/slider\d+/)) el=el.parentNode;
		if (!el) return false;
		if (!el.id || !el.id.match(/slider\d+/)) return false;

		return el;
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	function attachSliderEvents() {
		var divs=document.getElementsByTagName('div');
		var divNum;
		for(var i=0; i<divs.length; i++) {
			if (divNum=divs[i].id.match(/\bslider(\d+)\b/)) {
				// set initial properties
				divNum=parseInt(divNum[1]);
				divs[i].min=slider[divNum].min;
				divs[i].max=slider[divNum].max;
				divs[i].slidervalue=slider[divNum].slidervalue;
				divs[i].onchange=slider[divNum].onchange;
				divs[i].num=divNum;
				// and make sure the display matches
				drawSliderByVal(divs[i]);
				divs[i].onchange(divs[i].slidervalue, divNum);

				addAnEvent(divs[i], 'mousedown', function(e){
					sliderClick(e);
					var el=sliderFromEvent(e);
					if (!el) return;
					activeSlider=el.num;
					stopEvent(e);
				});
				addAnEvent(divs[i], 'mouseup', function(e){
					activeSlider=-1;
					stopEvent(e);
				});
			}
		}
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	//borrowed from prototype: http://prototype.conio.net/
	function stopEvent(event) {
		if (event.preventDefault) {
			event.preventDefault();
			event.stopPropagation();
		} else {
			event.returnValue=false;
			event.cancelBubble=true;

		}
	}
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
	addAnEvent(window, 'load', attachSliderEvents);
	addAnEvent(document, 'mousemove', sliderMouseMove);
	var activeSlider=-1;
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
