//todos
/*
- playlist trop large						-> vérifier
- prendre en compte les vidéos youtube

*/

// Identifiants des objets html
var oWrapperPage 		= '#wrapperPage';
var oPlayerBackground 	= '#playerBackground';
var oWrapperMovie 		= '#wrapperMovie';
var oAudioHolder 		= 'audioHolder';
var oVideoHolder 		= 'videoHolder';
var oPlayerPlaylist		= '#playerPlaylist';
var oPlayerClose 		= '#playerClose';
var oPlayerControl		= '#playerControl';
var oIdPlayerVideo 		= 'iPlayerVideo';
var oIdPlayerAudio 		= 'iPlayerAudio';					// inutilisé pour le moment
var oCloseWhenCompleted	= '#chkCloseWhenCompleted';
var oPanePlaylist		= '#panePlayerPlaylist';
var oPanePlaylistLoad	= '#panePlayerLoading';

var oPlayerBtnPlay		= '#playerControlPlay';
var oPlayerBtnPause		= '#playerControlPause';
var oTimePosition		= '#timePosition';
var oPlayerBar			= '#progressBar';
var oBufferBar			= '#progressBarBuffer';
var oTimeLength			= '#timeLength';
var oPlayerControlMute	= '#playerControlMute';
var oPlayerControlNotMute = '#playerControlNotMute';


// Variables d'environnement
var objectPlayer		= null;
var urlVideoPlayer 		= 'http://www.theoffspringsession.com/tools/player/player.swf';
var wPlayer				= 650;
var hPlayer				= 450;

// Version of Flash required
var requiredMajorFlashVersion 	= 9;		// Major version
var requiredMinorFlashVersion	= 0;		// Minor version
var requiredRevisionFlash		= 0;		// Revision version



// Etat du lecteur
var playerPosition = 0;
var playerVolume = 90;
var playerItem = 0;
var videoLength = 0;



// Variables flash
/*
var flashVasr = 'author=www.theoffspringsession.com';
flashVasr += '&controlbar=bottom';
flashVasr += '&shuffle=false';
flashVasr += '&stretching=uniform';
flashVasr += '&autostart=true';
flashVasr += '&enablejs=true';
flashVasr += '&skin=http://www.theoffspringsession.com/tools/player/skin.swf';
*/
var flashVars = {
	file: '',
	autostart: 'true',
    quality: 'true',
    controlbar: 'bottom',
	stretching: 'uniform',
    bufferlength: '1',
	volume: playerVolume,
	link: 'http://www.theoffspringsession.com',
	repeat: 'none',
	shuffle: 'false',
	debug: 'arthropod',
	enablejs: true,
	skin: 'http://www.theoffspringsession.com/tools/player/skin.swf',
	usefullscreen: true,
	item: 0
}

// Paramètres du lecteur
var params = {
	allowfullscreen: 'true',
	allowscriptaccess: 'always'
}

// Attributs de l'objet html
var attributes = {
	id: oIdPlayerVideo,
	name: oIdPlayerVideo
}




// This is a javascript handler for the player and is always needed.
function thisMovie(movieName) {
	if (navigator.appName.indexOf("Microsoft") != -1) {
		return window[movieName];
	} else {
		return document[movieName];
	}
};

// this function is caught by the JavascriptView object of the player.
function sendEvent(typ,prm) { 
	var player = thisMovie(oIdPlayerVideo);
	player.sendEvent(typ,prm);
};

/* -------------------------------------------------------------
	Récupère l'objet lecteur lorsque celui-ci est prêt

	Paramètre : 			obj, objet lecteur généré
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
/*
function playerReady(obj) {

	// Récupération du lecteur
	objectPlayer = document.getElementById(obj.id);

	// Ajout des listeners
	_addAllListeners();
}
*/



/* -------------------------------------------------------------
	Ajout des listeners afin de manipuler le lecteur via Javascript

	Paramètre : 			objPlayer, objet lecteur généré
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
/*
function _addAllListeners() {

    if (objectPlayer) {
        // Ajout des listeners des contrôles
		_addControllerlListeners();

		// Ajout des listeners des modes du lecteur
        _addModelListeners();

		// Ajout des listeners de visualisation
		_addViewListener();
    } else {
		// On réitère l'ajout
		setTimeout("_addAllListeners()", 100);
    }
}
*/


/* -------------------------------------------------------------
	Ajout des listeners des contrôles

	Paramètre : 			aucun
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _addControllerlListeners() {

    // Listener du niveau du volume
    //thisMovie(idPlayer).addControllerListener("VOLUME", "_volumeListener");

	// Listener de la playlist
	//thisMovie(idPlayer).addControllerListener("PLAYLIST", "_updateCalquePlaylist");

	// Listener de l'item de la playlist
	//thisMovie(idPlayer).addControllerListener("ITEM", "_playlistItemListener");
}



/* -------------------------------------------------------------
	Ajout des listeners des modes du lecteur

	Paramètre : 			aucun
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _addModelListeners() {

	// Listener de génération d'erreur
    thisMovie(idPlayer).addModelListener("ERROR", "_errorListener");

	// Listener de l'état du lecteur
    //thisMovie(idPlayer).addModelListener("STATE", "_stateListener");

	// Listener de la position de lecture
    //thisMovie(idPlayer).addModelListener("TIME", "_positionListener");
	
	// Listener du nombre de bytes chargés
	//thisMovie(idPlayer).addModelListener("LOADED", "_loadedListener");
}



/* -------------------------------------------------------------
	Ajout des listeners de visualisation

	Paramètre : 			aucun
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _addViewListener() {

	// Aucun pour le moment
}



/* -------------------------------------------------------------
	Affichage du lecteur multimédia vidéo

	Paramètre : 			p_width
							p_height
							p_callback, fonction à appeler à la fin de l'ouverture du lecteur
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _launchVideoPlayer(p_width, p_height, p_callback) {

	// Bug IE < 7 : les combos s'affichent au dessus des calques
	// On cache donc les combos des pages du site
	$('#frame').contents().find('select').fadeOut('normal');
	$('select').fadeOut('normal');

	// Définition des dimensions du player
	var wPlayerMax = $(document).width() - (2 * ($(oPlayerPlaylist).width() + 10));

	// Mise à jour des variables d'environnement
	wPlayer	= p_width > wPlayerMax || p_width == 0 ? wPlayerMax : p_width;
	hPlayer = p_height == 0 ? hPlayer : p_height;
	hPlayer = p_width > wPlayerMax && p_height != 0 ? ceil(wPlayerMax * p_height / p_width) : hPlayer;

	// Affichage des calques du lecteur
	$(oWrapperPage).fadeIn('slow', function() {
		$(oPlayerBackground).animate(
			{ width: $(document).width() + 'px',
			  height: (hPlayer + 22) + 'px' }, 1500,
				function() {
					// Redimensionnement du lecteur
					$(oWrapperMovie).width(wPlayer);
					$(oWrapperMovie).height(hPlayer + 20);

					// Affichage du calque d'attente
					$(oPanePlaylistLoad).show();
					$(oPanePlaylist).hide();

					// Affichage des entités
					$(oPlayerPlaylist).fadeIn('normal');
					$(oPlayerClose).fadeIn('normal');
					$(oWrapperMovie).fadeIn('normal', p_callback);
				}
		);
	});
}



/* -------------------------------------------------------------
	Fermeture du lecteur multimédia vidéo

	Paramètre : 			aucun
	Valeur retournée : 		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _closeVideoPlayer() {

	if (document.getElementById(oIdPlayerVideo)) {
		// On arrête puis on supprime le lecteur
		document.getElementById(oIdPlayerVideo).sendEvent('STOP');
		_deleteVideoPlayer(oIdPlayerVideo);
	}

	// Fermeture des calques du lecteur
	$(oPlayerPlaylist).fadeOut('fast');
	$(oPlayerClose).fadeOut('fast');
	$(oWrapperMovie).fadeOut('fast', function() {
		$(oPlayerBackground).animate(
			{ width: '0px' }, 1000,
				function() {
					$(oWrapperPage).fadeOut('fast', function() {
						// Bug IE < 7 : les combos s'affichent au dessus des calques
						// On affiche à nouveau les combos des pages du site
						$('#frame').contents().find('select').fadeIn('fast');
						$('select').fadeIn('fast');
					});
				}
		);
	});
}



/* -------------------------------------------------------------
	Suppression du lecteur multimédia vidéo

	Paramètre : 			identifiant html du lecteur
	Valeur retournée :		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _deleteVideoPlayer(p_iPlayer) {

	if (document.getElementById(oIdPlayerVideo)) {
		// Suppression physique du lecteur existant
		//swfobject.removeSWF (oIdPlayerVideo);
	}

	// Régénération du calque
	$(oWrapperMovie).html('<div id=' + oVideoHolder + '></div>');

	// Suppression des informations du cadre de la playlist
	$(oPanePlaylist).html(' ');

	// Réinitialisation de la scrollbar de la playlist
	//$(oPanePlaylist).jScrollPane({showArrows:false, scrollbarWidth:7, animateTo:true, animateInterval:50, animateStep:3});
}



/* -------------------------------------------------------------
	Création du lecteur multimédia vidéo

	Paramètres : 			p_wPlayer, largeur en pixel du lecteur
							p_hPlayer, hauteur en pixel du lecteur
	Valeur retournée :		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _createVideoPlayer(p_wPlayer, p_hPlayer, p_xmlFile) {

	// Calcul des positions des éléments du lecteur
	var leftPlayerClose = ($(window).width() / 2) + ($(oWrapperMovie).width() / 2) + 20;
	var topPlayerClose = ($(window).height() / 2) - ($(oWrapperMovie).height() / 2) - 20;
	var leftPlayerPlaylist = ($(window).width() / 2) - ($(oWrapperMovie).width() / 2) - $(oPlayerPlaylist).width() - 20;
	var topPlayerPlaylist = ($(window).height() / 2) + ($(oWrapperMovie).height() / 2) - $(oPlayerPlaylist).height();

	// Positionnement des éléments du lecteur
	$(oPlayerClose).animate({left: leftPlayerClose + 'px', top: topPlayerClose + 'px'}, 600);
	$(oPlayerPlaylist).animate({left: leftPlayerPlaylist + 'px', top: topPlayerPlaylist + 'px'}, 600);

	// Mise à jour des variables d'environnement
	//flashVars['volume'] = playerVolume;

	// On vérifie si l'utilisateur possède la bonne version de flash
	if (!DetectFlashVer(requiredMajorFlashVersion, requiredMinorFlashVersion, requiredRevisionFlash)) {
		// Flash is too old or we can't detect the plugin
		$('#' + oVideoHolder).html('<br /><br /><br /><b>This player requires the Adobe Flash Player.<br />'
						+ '<a href="http://www.adobe.com/go/getflash/">Get/upgrade your version here</a></b>.');
	}
/*
	// Création physique du lecteur
	var s1 = new swfobject(urlVideoPlayer, 'player', p_wPlayer, p_hPlayer + 20, '9.0.115');
	s1.addParam('allowfullscreen','true');
	s1.addParam('allowscriptaccess','always');
	s1.addParam('flashvars',flashvars);
	s1.write(oVideoHolder);
*/


	var s1 = new SWFObject(urlVideoPlayer, oIdPlayerVideo, p_wPlayer, p_hPlayer + 20, "8");
	//var s1 = new SWFObject('http://player.longtailvideo.com/player.swf', oIdPlayerVideo, p_wPlayer, p_hPlayer + 20, "8");
	s1.addParam("allowfullscreen", "true");
	s1.addParam("allowscriptaccess", "always");

	s1.addVariable("file", p_xmlFile);
	s1.addVariable("shuffle", "false");
	s1.addVariable("linktarget", "_self");


	s1.addVariable('fullscreen','true');
	//s1.addParam("allowfullscreen","true");
	s1.addParam("wmode","opaque");

	s1.addVariable("enablejs", "true");
	s1.addVariable("javascriptid", oIdPlayerVideo);
	s1.addVariable("autostart", "true");
	s1.addVariable("skin", "http://www.theoffspringsession.com/tools/player/skin.swf");



	s1.write(oVideoHolder);

	
	_updateCalquePlaylist(p_xmlFile);

/*
	swfobject.embedSWF	(urlVideoPlayer, oVideoHolder, p_wPlayer, p_hPlayer + 20, "9.0.115", false,
							flashVars, params, attributes);
*/

	
}














function _loadItemVideo(p_iVidf, p_width, p_height) {

	if (p_iVidf != null) {
		// Envoi des paramètres au lecteur vidéo
		var xmlPlaylist = "item-video-xml-" + p_iVidf + ".xml";

		// Ouverture de la playlist
		_openPlaylistFile(xmlPlaylist, p_width, p_height);
	}
}


function _loadVideoPlaylist(p_iPlay, p_width, p_height) {

	if (p_iPlay != null) {
		// Envoi des paramètres au lecteur vidéo
		var xmlPlaylist = "playlist-xml-" + p_iPlay + ".xml";

		// Ouverture de la playlist
		_openPlaylistFile(xmlPlaylist, p_width, p_height);
	}
}











/* -------------------------------------------------------------
	Créer un lecteur avec la playlist passée en paramètre

	Paramètres : 			p_xmlFile, chemin relatif de la playlist (fichier xml obligatoirement)
							p_width, largeur en pixel du lecteur
							p_height, hauteur en pixel du lecteur
	Valeur retournée :		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _openPlaylistFile(p_xmlFile, p_width, p_height) {

	// Suppression du lecteur existant
	_deleteVideoPlayer(oIdPlayerVideo);

	// Ajout de la playlist dans le nouveau lecteur
	_launchVideoPlayer(
			wPlayer, hPlayer,
			function() {
				// Ajout de la playlist à lire
				flashVars['file'] = p_xmlFile;

				// Création du lecteur
				_createVideoPlayer(wPlayer, hPlayer, p_xmlFile);
	});
}



/* -------------------------------------------------------------
	Mise à jour du calque contenant la playlist du lecteur

	Paramètre : 			aucun
	Valeur retournée :		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
function _updateCalquePlaylist(p_xmlFile) {

	// Variable contenant le code html du cadre
	var htmlPlay = '';
	var i = 0;

	// Appel ajax pour récupérer le modèle des éléments de la playlist
	var masquePlaylist = $.ajax({
							url: '/asynchronous/qr-mult-video-masque-html-playlist.php5',
	 						async: false
						}).responseText;

	// Appel ajax pour récupérer le modèle des éléments de la playlist
	var playlist = $.ajax({
							url: p_xmlFile,
	 						async: false
						}).responseXML;

	$(playlist).find('track').each(function() {
		// On construit le cadre de playlist

		// Gestion de la longueur du titre de la vidéo
		var title = $(this).find('title:first').text();
		var vidfName = title.length > 25 ? title.substr(0, 25) + '...' : title;

		// Construction des données de l'item en cours
		var item = masquePlaylist;
		item = item.replace('{@num}', new Number(i) + 1);
		item = item.replace('{@title}', vidfName);
		item = item.replace('{@duree}', $(this).find('duration:first').text());
		item = item.replace('{@image}', $(this).find('image:first').text());
		item = item.replace('{@width}', $(oWrapperMovie).width());
		item = item.replace('{@height}', $(oWrapperMovie).height());
		item = item.replace('{@info}', $(this).find('link:first').text());
		item = item.replace(/{@indice}/g, i);
		htmlPlay += item;
		i++;
	});
	
/*
	if (playlist) {

		for(var i in playlist) { 
			// On construit le cadre de playlist

			// Gestion de la longueur du titre de la vidéo
			var vidfName = playlist[i].title.length > 25 ?
								playlist[i].title.substr(0, 25) + '...' : playlist[i].title;

			// Construction des données de l'item en cours
			var item = masquePlaylist;
			item = item.replace('{@num}', new Number(i) + 1);
			item = item.replace('{@title}', vidfName);
			item = item.replace('{@duree}', playlist[i].duration);
			item = item.replace('{@image}', playlist[i].image);
			item = item.replace('{@width}', $(oWrapperMovie).width());
			item = item.replace('{@height}', $(oWrapperMovie).height());
			item = item.replace('{@info}', playlist[i].link);
			item = item.replace(/{@indice}/g, i);
			htmlPlay += item;
		}
	}
*/

	// Mise à jour du calque
	$(oPanePlaylist).html(htmlPlay);
	$(oPanePlaylistLoad).hide();
	$(oPanePlaylist).show();
	
	// Initialisation de la scrollbar de la playlist
	//$(oPanePlaylist).jScrollPane({showArrows:false, scrollbarWidth:7, animateTo:true, animateInterval:50, animateStep:3});
}



/* -------------------------------------------------------------
	Permet de reprendre la lecture à la vidéo courante pour une reconstruction du lecteur
	Appelée après modification de paramètres flash tel repeat et shuffle

	Paramètre : 			aucun
	Valeur retournée :		aucune
	Auteur : 				Sébastien JOUBERT
	-------------------------------------------------------------*/
/*
	function _goOnLecture() {

	// On récupère l'index de la vidéo courante
	flashVars['item'] = playerItem;

	// On supprime le lecteur
	_deleteVideoPlayer(oIdPlayerVideo);

	// On regénère le lecteur
	//_createVideoPlayer(wPlayer, hPlayer);	
}
*/

function _player_voteCurrentVideo(p_numOrdre) {

	// Récupération des informations nécessaires au star rating
	var infos = $('.video_infos_' + p_numOrdre);

	if (infos) {
		// Découpage des informations
		var datas = infos.val().split('@aAjJaAxX@');

		if (datas.length == 2) {
			// Initialisation de la note courante
			$(':radio.star-video-current').val(datas[1]);

			// Construction du star rating
			$(':radio.star-video-current').rating({
				callback: 	function(value, link) {
								_starRating_ajouterNoteVideo(datas[0], value);
							}
			});
		}
	}
}



/* Contrôles */

// Afficher / cacher les boutons de lecture et de pause
function _playPauseToggle() 				{ $(oPlayerBtnPlay).toggle();
											  $(oPlayerBtnPause).toggle();
											  objectPlayer.sendEvent('PLAY');						}
// Stopper la lecture
function _stopPlayer() 						{ objectPlayer.sendEvent('STOP'); 						}

// Aller à la vidéo précédente
function _playPreviousItem() 				{ objectPlayer.sendEvent('PREV'); 						}

// Aller à la vidéo suivante
function _playNextItem() 					{ objectPlayer.sendEvent('NEXT'); 						}

// Afficher / cacher les boutons de mise à muet
function _soundMuteToggle() 				{ $(oPlayerControlMute).toggle();
											  $(oPlayerControlNotMute).toggle();
											  objectPlayer.sendEvent('MUTE');						}
// Baisse le volume
function _increaseVolume() 					{ objectPlayer.sendEvent('VOLUME', playerVolume + 10); 	}

// Augmenter le volume
function _decreaseVolume() 					{ objectPlayer.sendEvent('VOLUME', playerVolume - 10); 	}

// Atteindre une position
function _seekPosition (p_position) 		{ objectPlayer.sendEvent('SEEK', p_position); 			}

// Mettre en plein écran
function _setFullscreen() 					{ objectPlayer.sendEvent('FULLSCREEN'); 				}

// Rembobiner de 30 secondes
function _scrubBackward()			 		{ objectPlayer.sendEvent('SEEK', playerPosition - 30); 	}

// Avancer de 30 secondes
function _scrubForward()			 		{ objectPlayer.sendEvent('SEEK', playerPosition + 30); 	}

// Jouer une vidéo de la playlist
function _playPlaylistItem (p_numOrdre) 	{
	sendEvent('playitem', p_numOrdre);
	_player_voteCurrentVideo(p_numOrdre);
		//objectPlayer.sendEvent('playitem', p_numOrdre);
		//_player_voteCurrentVideo(p_numOrdre);
}

// Reconstruire l'objet avec lecture aléatoire
// TODO à mettre à jour pour que ça fonctionne dans les 2 sens
function _shuffleToggle()					{ flashVars['shuffle'] = 'true';
											  _goOnLecture();										}

// Reconstruire l'objet avec lecture répétée
// TODO à mettre à jour pour que ça fonctionne dans les 2 sens
function _repeatToggle()					{ flashVars['shuffle'] = 'always';
											  _goOnLecture();										}




/* Listeners */

// Gère la position du curseur de lecture et la barre de défilement
function _positionListener (obj) 			{ playerPosition = Math.floor(obj.position);
											  videoLength = Math.floor(obj.duration);
											  $(oTimePosition).html(formatTimeLength(playerPosition));
											  $(oTimeLength).html(formatTimeLength(videoLength));
											  $(oPlayerBar).reportprogress(Math.floor(playerPosition * 100 / videoLength));
											  														}
// Gère la position du volume
function _volumeListener (obj) 				{ playerVolume = obj.percentage; 						}

// Gère l'état du lecteur
function _stateListener(obj) 				{ if ($(oCloseWhenCompleted).attr("checked")
														&& obj.newstate == "COMPLETED"
														&& (playerItem == objectPlayer.getPlaylist().length - 1)) {
													_closeVideoPlayer();
											  	}
											 														}

// Gère les erreurs envoyées par le lecteur
function _errorListener(obj) 				{ alert("Error " + obj.id + " :\n\t" + obj.message);	}

// Gère la barre de situation du buffer
function _loadedListener(obj)				{ $(oBufferBar).reportprogress(Math.floor(obj.loaded * 100 / obj.total));
																									}
// Gère les données de l'item en cours
function _playlistItemListener(obj) 		{

	//playerItem = obj.index;
	//_player_voteCurrentVideo(obj.index);
}





//--- FONCTION : FORMATAGE D'UNE DUREE EN SECONDES
function formatTimeLength (p_nbSec) {

	if (p_nbSec == null || p_nbSec == 0) {
		// Le paramètre n'est pas renseigné
		return '-N/A-';
	}

	// Sécurité sur la récupération du nombre de secondes
	var nbSec = Math.abs(new Number(p_nbSec));

	// Calcul du nombre d'heures, de minutes et de secondes
	var minu = Math.floor(nbSec / 60);
	var seco = p_nbSec - (minu * 60);
	var heur = Math.floor(minu / 60);

	// Si il y a plus de 60 minutes
	if (heur > 0)
		minu = minu - (heur * 60);

	// Formatage des données
	if (minu < 10 && heur > 0)
		minu = "0" + minu;
	if (seco < 10)
		seco = "0" + seco;

	// Retour de la durée au bon format hh:mm:ss
	return (heur > 0) ? heur + ":" + minu + ":" + seco : minu + ":" + seco;
}
