/* Copyright 2010 Till Claassen (http://pixelistik.de/) */
/*jslint browser: true */
/*global $,swfobject,flowplayer,piwikTracker,matrixHostingMode,window:false */
var player;

function play(imgObject){
	// Position:
	$("#player").css("top",$(imgObject).offset().top-$("#player .player-bar").css("height").replace(/px,*\)*/g,"")-17);
	$("#player").css("left",$(imgObject).offset().left-$("#player").css("padding-left").replace(/px,*\)*/g,"")-32);
	// Read person information from data-attributes
	$("#person-name").text(
		$(imgObject).parent().data("person-name")
	);
	$("#person-organisation").text(
		$(imgObject).parent().data("person-organisation")
	);
	
	player.play(imgObject);
}

function onYouTubePlayerReady(playerId){
	player.youtubePlayerReady();
}


function matrixPlayer(style){
	// Some consts, private:
	var STYLE_YOUTUBE=0;
	var STYLE_FLOWPLAYER=1;
	
	var playerStyle=style;
	var youtubePlayer;
	var flowplayerPlayer;
	var displayTimer;
	
	// Helpers:
	var hidePlayerDiv=function(){
		$("#player").css("z-index",-1);
		$("#player").css("left",-300);
		$("#player").fadeTo(200,0.01);
	};
	var showPlayerDiv=function(){
		$("#player").css("z-index",100);
		$("#player").fadeTo(800,1);
	};
	var youtubeGetVideoIdFromThumbnailUrl=function (url){
		return(url.replace(/^.*\/|\.[^.]*$/g, '')
);
	};
	var flowplayerGetVideoUrlFromThumbnailUrl=function (url){
		// Just change the extension:
		return(url.substr( 0, url.lastIndexOf( "." ) ) + ".mp4");
	};
	var startFromUrl=function (){
		if(window.location.hash!=null && window.location.hash!='-'){
			play(
				$(window.location.hash).children('img')
			);
			window.location.hash='-';
		}
	};
	
	// *** refreshTimeDisplay ***
	// Private:
	var refreshTimeDisplay_youtube=function(){
		// Display remaining time
		var duration=youtubePlayer.getDuration();
		var remainingSeconds=duration-youtubePlayer.getCurrentTime();
		var remainingMinutes=Math.floor(remainingSeconds/60);
		remainingSeconds=Math.floor(remainingSeconds % 60);
		// Create leading zero
		if(String(remainingSeconds).length==1){
			remainingSeconds='0'+remainingSeconds;
		}
		$('#timedisplay').text('-'+remainingMinutes+':'+remainingSeconds);
	};
	// Private:
	var refreshTimeDisplay_flowplayer=function(){
		// Display remaining time
		var duration=flowplayerPlayer.getClip().fullDuration;
		var remainingSeconds=duration-flowplayerPlayer.getTime();
		var remainingMinutes=Math.floor(remainingSeconds/60);
		remainingSeconds=Math.floor(remainingSeconds % 60);
		// Create leading zero
		if(String(remainingSeconds).length==1){
			remainingSeconds='0'+remainingSeconds;
		}
		$('#timedisplay').text('-'+remainingMinutes+':'+remainingSeconds);
	};
	// Privileged:
	this.refreshTimeDisplay=function(){
		switch(playerStyle){
			case STYLE_YOUTUBE:
				refreshTimeDisplay_youtube();
			break;
			case STYLE_FLOWPLAYER:
				refreshTimeDisplay_flowplayer();
			break;
		}
	};
	
	// Private:
	var trackVideoPlay=function(title){
		// If Piwik is present, track every video play
		if(piwikTracker){
			piwikTracker.setCustomUrl(window.location+"-videoplays/"+title);
			piwikTracker.setDocumentTitle(document.title+" - Videoplays/"+title);
			piwikTracker.trackPageView();
			//piwikTracker.trackGoal(1);
		}
	};
	
	// *** init ***
	// Private:
	var init_youtube=function(){
		// Create Youtube player:
		var params = { 
			allowScriptAccess: "always",
			wmode: "opaque"
		};
		var atts = { id: "ytplayer1" };
		swfobject.embedSWF("http://www.youtube.com/apiplayer?enablejsapi=1&playerapiid=ytplayer1", 
			"player-inner", "255", "143", "8", null, null, params, atts);
	};
	// Private:
	var init_flowplayer=function(){
		// Create Flowplayer:
		flowplayerPlayer=flowplayer(
			"player-inner", 
			"flowplayer/flowplayer-3.1.2.swf",
			{
				plugins: {
					controls:null
				}
			}
		);
		flowplayerPlayer.onFinish(function(clip){
			window.clearInterval(displayTimer);
			hidePlayerDiv();
		});
	};
	// Privileged:
	this.init=function(){
		switch(playerStyle){
			case STYLE_YOUTUBE:
				init_youtube();
			break;
			case STYLE_FLOWPLAYER:
				init_flowplayer();
			break;
		}
		$("#player").fadeTo(3,0.01);
	};
	
	// *** play ***
	// Private:
	var play_youtube=function(video){
		youtubePlayer.loadVideoById(youtubeGetVideoIdFromThumbnailUrl($(video).attr("src")), 0,'small');
	};
	// Private:
	var play_flowplayer=function(video){
		//flowplayerPlayer.play("videos/test.flv");
		flowplayerPlayer.play(flowplayerGetVideoUrlFromThumbnailUrl($(video).attr("src")));
	};
	// Privileged:
	this.play=function(video){
		switch(playerStyle){
			case STYLE_YOUTUBE:
				play_youtube(video);
			break;
			case STYLE_FLOWPLAYER:
				play_flowplayer(video);
			break;
		}
		// Start showing time:
		displayTimer=window.setInterval(player.refreshTimeDisplay,1000);
		showPlayerDiv();
		trackVideoPlay($(video).attr("alt"));
	};
	
	// *** stop ***
	// Private:
	var stop_youtube=function(){
		youtubePlayer.stopVideo();
	};
	// Private:
	var stop_flowplayer=function(){
		flowplayerPlayer.stop();
	};
	// Privileged:
	this.stop=function(){
		switch(playerStyle){
			case STYLE_YOUTUBE:
				stop_youtube();
			break;
			case STYLE_FLOWPLAYER:
				stop_flowplayer();
			break;
		}
		window.clearInterval(displayTimer);
		hidePlayerDiv();
	};
	
	// Youtube player callbacks:
	this.youtubePlayerReady=function(){
		youtubePlayer=document.getElementById("ytplayer1");
		youtubePlayer.addEventListener("onStateChange", "player.youtubePlayerStateChange");
		startFromUrl();
	}
	this.youtubePlayerStateChange=function(newState){
		if(newState==1 || newState==3){
			showPlayerDiv();
		}else{
			hidePlayerDiv();
			clearInterval(displayTimer);
		}
	};
}

$(document).ready(
	function(){
		$('.thumbnail img').supersleight();
		$("#question-bar").scrollFollow({});
		$('.thumbnail[title]').tipsy({
				gravity: 's',
				fade: false,
				html: true
		});
		
		player=new matrixPlayer(matrixHostingMode);
		player.init();
		
				
		$(".thumbnail").click(function(){
			play($(this).children('img'));
		});
		
		$("#stop-player").click(function(){
			player.stop();
		});
		
		
	
	}
);

