examples/LdtPlayer-release.js
branchnew-model
changeset 882 61c384dda19e
parent 881 f11b234497f7
child 883 d35ad8111c5e
equal deleted inserted replaced
881:f11b234497f7 882:61c384dda19e
     1 /* 	
       
     2  *	Copyright 2010 Institut de recherche et d'innovation 
       
     3  *	contributor(s) : Samuel Huron 
       
     4  *	Use Silvia Pfeiffer 's javascript mediafragment implementation
       
     5  *
       
     6  *	contact@iri.centrepompidou.fr
       
     7  *	http://www.iri.centrepompidou.fr 
       
     8  *	 
       
     9  *	This software is a computer program whose purpose is to show and add annotations on a video .
       
    10  *	This software is governed by the CeCILL-C license under French law and
       
    11  *	abiding by the rules of distribution of free software. You can  use, 
       
    12  *	modify and/ or redistribute the software under the terms of the CeCILL-C
       
    13  *	license as circulated by CEA, CNRS and INRIA at the following URL
       
    14  *	"http://www.cecill.info". 
       
    15  *	
       
    16  *	The fact that you are presently reading this means that you have had
       
    17  *	knowledge of the CeCILL-C license and that you accept its terms.
       
    18 */
       
    19 
       
    20 if ( window.IriSP === undefined && window.__IriSP === undefined ) { 
       
    21 	var IriSP = {}; 
       
    22 	var __IriSP = IriSP; /* for backward compatibility */
       
    23 }
       
    24 
       
    25 		
       
    26 // Official instance - to refactor ?
       
    27 IriSP.MyLdt 		= null;
       
    28 IriSP.MyTags 		= null;
       
    29 IriSP.MyApiPlayer	= null;
       
    30 IriSP.player		= null;
       
    31 
       
    32 // genral var (old code) - to refactor 
       
    33 IriSP.Durration		= null;
       
    34 IriSP.playerLdtWidth	= null;
       
    35 IriSP.playerLdtHeight	= null;
       
    36 
       
    37 
       
    38 IriSP.init = function ( config ) {		
       
    39 		if ( config === null ) {
       
    40 			IriSP.config 			 = IriSP.configDefault;
       
    41 		} else {
       
    42 			
       
    43 			IriSP.config 			 = config;
       
    44 						
       
    45 			if ( IriSP.config.player.params == null ) {
       
    46 				IriSP.config.player.params = IriSP.configDefault.player.params;
       
    47 			}
       
    48 			
       
    49 			if ( IriSP.config.player.flashvars == null ) {
       
    50 				IriSP.config.player.flashvars = IriSP.configDefault.player.flashvars;
       
    51 			}
       
    52 			
       
    53 			if ( IriSP.config.player.attributes == null ) {
       
    54 				IriSP.config.player.attributes = IriSP.configDefault.player.attributes;
       
    55 			}
       
    56 		}
       
    57 		
       
    58 		var metadataSrc 		 = IriSP.config.metadata.src;
       
    59 		var guiContainer		 = IriSP.config.gui.container;
       
    60 		var guiMode				 = IriSP.config.gui.mode;
       
    61 		var guiLdtShareTool		 = IriSP.LdtShareTool;
       
    62 		
       
    63 		// Localize jQuery variable
       
    64 		IriSP.jQuery = null;
       
    65 
       
    66 		/* FIXME : to refactor using popcorn.getscript ? */
       
    67 		/******** Load jQuery if not present *********/
       
    68 		if ( window.jQuery === undefined || window.jQuery.fn.jquery !== '1.4.2' ) {
       
    69 			
       
    70 			var script_tag = document.createElement( 'script' );
       
    71 			script_tag.setAttribute( "type", "text/javascript" );
       
    72 			script_tag.setAttribute( "src", IriSP.lib.jQuery );
       
    73 			
       
    74 			script_tag.onload = scriptLibHandler;
       
    75 			script_tag.onreadystatechange = function () { // Same thing but for IE
       
    76 				if ( this.readyState == 'complete' || this.readyState == 'loaded' ) {
       
    77 					scriptLibHandler();					
       
    78 				}
       
    79 			};
       
    80 			
       
    81 			// Try to find the head, otherwise default to the documentElement
       
    82 			( document.getElementsByTagName("head")[0] || document.documentElement ).appendChild( script_tag );
       
    83 		} else {
       
    84 			// The jQuery version on the window is the one we want to use
       
    85 			 IriSP.jQuery = window.jQuery;
       
    86 			 scriptLibHandler();
       
    87 		}
       
    88 
       
    89 		/******** Called once jQuery has loaded ******/
       
    90 		function scriptLibHandler() {
       
    91 			
       
    92 			var script_jqUi_tooltip = document.createElement( 'script' );
       
    93 			script_jqUi_tooltip.setAttribute( "type", "text/javascript" );
       
    94 			script_jqUi_tooltip.setAttribute( "src", IriSP.lib.jQueryToolTip );
       
    95 			script_jqUi_tooltip.onload = scriptLoadHandler;
       
    96 			script_jqUi_tooltip.onreadystatechange = function () { // Same thing but for IE
       
    97 				if ( this.readyState == 'complete' || this.readyState == 'loaded' ) {
       
    98 					scriptLoadHandler( "jquery.tools.min.js loded" );
       
    99 				}
       
   100 			};
       
   101 			
       
   102 			var script_swfObj = document.createElement('script');
       
   103 			script_swfObj.setAttribute( "type","text/javascript" );
       
   104 			script_swfObj.setAttribute( "src",IriSP.lib.swfObject );
       
   105 			script_swfObj.onload = scriptLoadHandler;
       
   106 			script_swfObj.onreadystatechange = function () { // Same thing but for IE
       
   107 				if ( this.readyState == 'complete' || this.readyState == 'loaded' ) {
       
   108 					scriptLoadHandler( "swfobject.js loded" );
       
   109 				}
       
   110 			};
       
   111 		
       
   112 			var script_jqUi = document.createElement( 'script' );
       
   113 			script_jqUi.setAttribute( "type","text/javascript" );
       
   114 			script_jqUi.setAttribute( "src",IriSP.lib.jQueryUI );
       
   115 			script_jqUi.onload = scriptLoadHandler;
       
   116 			script_jqUi.onreadystatechange = function () { // Same thing but for IE
       
   117 				if ( this.readyState == 'complete' || this.readyState == 'loaded' ) {
       
   118 					scriptLoadHandler( "jquery-ui.min.js loded" );
       
   119 				}
       
   120 			};
       
   121 		
       
   122 
       
   123 			( document.getElementsByTagName("head")[0] || document.documentElement ).appendChild( script_jqUi_tooltip);
       
   124 			( document.getElementsByTagName("head")[0] || document.documentElement ).appendChild( script_jqUi );
       
   125 			( document.getElementsByTagName("head")[0] || document.documentElement ).appendChild( script_swfObj );
       
   126 			
       
   127 
       
   128 		};
       
   129 
       
   130 		/******** Called once all lib are loaded ******/
       
   131 		var loadLib = 0;
       
   132 		/* FIXME : ugly */
       
   133 		function scriptLoadHandler( Mylib ) {
       
   134 			//alert(Mylib);
       
   135 			loadLib +=1;
       
   136 			if( loadLib===3 ) { 
       
   137 				main(); 			  
       
   138 			}
       
   139 		};
       
   140 
       
   141 		/******** Our main function ********/
       
   142 		function main() { 
       
   143 			
       
   144 
       
   145 			//  Make our own IriSP.jQuery and restore window.jQuery if there was one. 
       
   146 			IriSP.jQuery = window.jQuery.noConflict( true );
       
   147 			// Call ours Jquery
       
   148 			IriSP.jQuery( document ).ready( function($) { 
       
   149 				
       
   150 				/******* Load CSS *******/
       
   151 				var css_link_jquery = IriSP.jQuery( "<link>", { 
       
   152 					rel: "stylesheet", 
       
   153 					type: "text/css", 
       
   154 					href: IriSP.lib.cssjQueryUI,
       
   155 					'class': "dynamic_css"
       
   156 				} );
       
   157 				var css_link_custom = IriSP.jQuery( "<link>", { 
       
   158 					rel: "stylesheet", 
       
   159 					type: "text/css", 
       
   160 					href: IriSP.config.gui.css,
       
   161 					'class': "dynamic_css"
       
   162 				} );
       
   163 				
       
   164 				css_link_jquery.appendTo( 'head' );
       
   165 				css_link_custom.appendTo( 'head' );   
       
   166 
       
   167 				// to see dynamicly loaded css on IE
       
   168 				if ( $.browser.msie ) {
       
   169 					$( '.dynamic_css' ).clone().appendTo( 'head' );
       
   170 				}
       
   171 				
       
   172 				//__IriSP.trace("main","ready createMyHtml");
       
   173 				
       
   174 				IriSP.createPlayerChrome();
       
   175 				
       
   176 				/******* Load Metadata *******/
       
   177 				IriSP.getMetadata();
       
   178 			
       
   179 			});
       
   180 		}
       
   181 
       
   182 };
       
   183 
       
   184 
       
   185 __IriSP.Media = function ( id, url, duration, title, description ) {
       
   186 		this.id 		 	= id;
       
   187 		this.url 		= url;
       
   188 		this.title 		= title;
       
   189 		this.description = description;
       
   190 		this.duration 	= duration;
       
   191 		this.lignes 	  	= new Array();
       
   192 
       
   193 		IriSP.trace( "__IriSP.Media" , "Media ID : "+id);
       
   194 		IriSP.trace( "__IriSP.Media" , "Media URL : "+url);
       
   195 		IriSP.trace( "__IriSP.Media" , "Media title : "+title);
       
   196 };
       
   197 
       
   198 __IriSP.Media.prototype.createPlayerMedia = function ( width, height, MyStreamer, MySwfPath) {
       
   199 		IriSP.MyApiPlayer = new __IriSP.APIplayer( width, height, this.url, this.duration, MyStreamer, MySwfPath);
       
   200 		//createPlayer(width,height,this.url,this.duration,MyStreamer,MySwfPath);
       
   201 };
       
   202 
       
   203 __IriSP.Media.prototype.getMediaDuration = function () {
       
   204 		return (this.duration);
       
   205 };
       
   206 
       
   207 __IriSP.Media.prototype.getMediaTitle = function (){
       
   208 		return (this.title);
       
   209 };
       
   210 
       
   211 
       
   212 
       
   213 
       
   214 
       
   215 
       
   216 /*  FIXME : API player - work in progress ... need refactoring of code */ 
       
   217 __IriSP.APIplayer = function ( width, height, url, duration, streamerPath, MySwfPath){
       
   218 		
       
   219 		
       
   220 		this.player 			= null;
       
   221 		this.hashchangeUpdate 	= null;
       
   222 		
       
   223 		this.width				= width;
       
   224 		this.height				= height;
       
   225 		this.url				= url;
       
   226 		this.duration			= duration;
       
   227 		this.streamerPath		= streamerPath;
       
   228 		this.MySwfPath			= MySwfPath;
       
   229 		
       
   230 		IriSP.MyApiPlayer		= this;
       
   231 		
       
   232 		IriSP.createPlayer( this.url, this.streamerPath );
       
   233 		IriSP.trace( "__IriSP.APIplayer", "__IriSP.createPlayer" );
       
   234 	
       
   235 	//__IriSP.config.player
       
   236 	/*
       
   237 	- dailymotion  // &enableApi=1&chromeless=1
       
   238 	- youtube 
       
   239 	- html5
       
   240 	- flowplayer 
       
   241 	- jwplayer
       
   242 	*/
       
   243 		
       
   244 };
       
   245 
       
   246 __IriSP.APIplayer.prototype.ready = function( player ) {
       
   247 
       
   248 	//__IriSP.trace("__IriSP.APIplayer.prototype.APIpReady"," __IriSP.createInterface");
       
   249 	IriSP.createInterface( this.width, this.height, this.duration );
       
   250 	//__IriSP.trace("__IriSP.APIplayer.prototype.APIpReady","END  __IriSP.createInterface");
       
   251 
       
   252 	// hashchange EVENT
       
   253 	if ( window.addEventListener ){
       
   254 	
       
   255 	// for firefox  hashchange EVENT
       
   256 		window.addEventListener( "hashchange", function() {
       
   257 		  var url = window.location.href;
       
   258 		  var time = IriSP.retrieveTimeFragment( url );
       
   259 		  IriSP.trace( "__IriSP.APIplayer.prototype.ready", time );
       
   260 		  if( IriSP.MyApiPlayer.hashchangeUpdate==null ){
       
   261 			IriSP.MyApiPlayer.seek( time );
       
   262 			
       
   263 		  } else {			  
       
   264 			IriSP.MyApiPlayer.hashchangeUpdate = null;
       
   265 		  }
       
   266 		}, false );
       
   267 	 
       
   268 	} else if (window.attachEvent){
       
   269 	// for ie hashchange EVENT
       
   270 		window.attachEvent( "onhashchange", function() {
       
   271 		  IriSP.trace( "hashchange",time );
       
   272 		  var url = window.location.href;
       
   273 		  var time = IriSP.retrieveTimeFragment( url );
       
   274 		  if( IriSP.MyApiPlayer.hashchangeUpdate == null ){
       
   275 			IriSP.MyApiPlayer.seek(time);
       
   276 		  } else {
       
   277 			IriSP.MyApiPlayer.hashchangeUpdate = null;
       
   278 		  }
       
   279 		}, false);
       
   280 	}
       
   281 	
       
   282 	// Search
       
   283 	//__IriSP.jQuery("#LdtSearchInput").change(function() {__IriSP.Search(this.value);});
       
   284 	//__IriSP.jQuery("#LdtSearchInput").live('change', function(event) {__IriSP.Search(this.value);}); 
       
   285 	IriSP.jQuery( "#LdtSearchInput" ).keydown( function() { IriSP.Search( this.value );} );
       
   286 	IriSP.jQuery("#LdtSearchInput").keyup( function() { IriSP.Search( this.value );} );
       
   287 	
       
   288 };
       
   289 
       
   290 __IriSP.APIplayer.prototype.pause = function(){
       
   291 	this.hashchangeUpdate = true;
       
   292 	IriSP.player.sendEvent( 'PAUSE' );
       
   293 };
       
   294 
       
   295 __IriSP.APIplayer.prototype.play  = function() {
       
   296 	this.hashchangeUpdate = true;
       
   297 	//__IriSP.trace("__IriSP.config.player.type",__IriSP.config.player.type);
       
   298 	if( IriSP.config.player.type=='jwplayer' ){
       
   299 	
       
   300 		IriSP.player.sendEvent( 'PLAY' );
       
   301 		
       
   302 	} else if(IriSP.config.player.type == 'dailymotion' 
       
   303 			  || IriSP.config.player.type == 'youtube' ) {
       
   304 			  
       
   305 		var status = IriSP.player.getPlayerState();
       
   306 		IriSP.trace( "__IriSP.APIplayer.prototype.play.status", status);
       
   307 		if ( status != 1 ){
       
   308 			IriSP.player.playVideo();
       
   309 		} else {
       
   310 			IriSP.player.pauseVideo();
       
   311 		}
       
   312 	}
       
   313 };
       
   314 
       
   315 __IriSP.APIplayer.prototype.mute  = function() {
       
   316 	IriSP.player.sendEvent( 'MUTE' );
       
   317 	
       
   318 	//alert(__IriSP.jQuery(".ui-icon-volume-on").css("background-position-x"));
       
   319 	/* FIXME : remove hardcoded values */
       
   320 	if ( IriSP.jQuery( ".ui-icon-volume-on" ).css( "background-position" ) == "-144px -160px" ){
       
   321 		IriSP.jQuery(" .ui-icon-volume-on ").css(" background-position ", "-130px -160px");
       
   322 	} else {
       
   323 		IriSP.jQuery( ".ui-icon-volume-on" ).css( "background-position", "-144px -160px" );
       
   324 	}
       
   325 };
       
   326 
       
   327 /* FIXME : rename */
       
   328 __IriSP.APIplayer.prototype.share = function( network ) {
       
   329 
       
   330 	/* FIXME : remove hardcoded */
       
   331 	var MyMessage = encodeURIComponent( "J'écoute Les Retours du Dimanche : " );
       
   332 	var MyURLNow = window.location.href;
       
   333 	var shareURL = null;
       
   334 	//alert(network+" : "+MyURLNow);
       
   335 	
       
   336 	/* FIXME : use a sharing library */
       
   337 	if(network == "facebook"){
       
   338 			shareURL = "http://www.facebook.com/share.php?u=";			
       
   339 		}else if(network == "twitter"){
       
   340 			shareURL  = "http://twitter.com/home?status="+MyMessage;	
       
   341 		}else if(network == "myspace"){
       
   342 			shareURL ="http://www.myspace.com/Modules/PostTo/Pages/?u=";
       
   343 		}else if(network == "delicious"){
       
   344 			shareURL = "http://delicious.com/save?url=";
       
   345 		}else if(network == "JameSpot"){
       
   346 			shareURL = "http://www.jamespot.com/?action=spotit&u=";
       
   347 			//alert(network+" non actif pour l'instant : "+MyURLNow);
       
   348 	}
       
   349 	
       
   350 	if (shareURL != null)
       
   351 		window.open( shareURL+encodeURIComponent(MyURLNow) );
       
   352 	//window.location.href = shareURL+encodeURIComponent(MyURLNow);
       
   353 };
       
   354 
       
   355 __IriSP.APIplayer.prototype.seek = function (time) {
       
   356 	
       
   357 	if( time==0 ) { time=1; }
       
   358 	
       
   359 	IriSP.trace( "__IriSP.APIplayer.prototype.seek", time );
       
   360 	
       
   361 	if( IriSP.config.player.type=='jwplayer') {
       
   362 		//__IriSP.MyApiPlayer.play()
       
   363 		IriSP.player.sendEvent( 'SEEK', time );
       
   364 	} else if( IriSP.config.player.type=='dailymotion'
       
   365 			|| IriSP.config.player.type=='youtube' ) {
       
   366 		IriSP.player.seekTo( time );
       
   367 	}
       
   368 	
       
   369 	this.changePageUrlOffset( time );
       
   370 };
       
   371 
       
   372 __IriSP.APIplayer.prototype.update = function (time) {
       
   373 	
       
   374 	if( time != 0 ) {
       
   375 		this.hashchangeUpdate = true;
       
   376 		
       
   377 		IriSP.trace( "__IriSP.APIplayer.prototype.update" ,time);
       
   378 		IriSP.player.sendEvent( 'SEEK', time );
       
   379 	}
       
   380 };
       
   381 
       
   382 __IriSP.APIplayer.prototype.changePageUrlOffset = function ( time ) {
       
   383 	//alert(time);
       
   384   IriSP.trace( "__IriSP.APIplayer.prototype.changePageUrlOffset" , "CHANGE URL "+ time);
       
   385   
       
   386   window.location.hash = "#t=" + time;
       
   387   window.location.href =  window.location.href;
       
   388   
       
   389 };
       
   390 
       
   391 /* Media Fragment functionality by Silvia Pfeiffer */ 
       
   392 
       
   393 IriSP.jumpToTimeoffset = function ( form ) {
       
   394 	var time = form.time.value;
       
   395 	IriSP.MyApiPlayer.changePageUrlOffset( time );
       
   396 };
       
   397 
       
   398 IriSP.retrieveTimeFragment = function ( url ) {
       
   399   var pageoffset = 0;
       
   400   var offsettime = 0;
       
   401   
       
   402   if ( url.split("#")[1] != null ) {
       
   403 	pageoffset = url.split( "#" )[1];
       
   404 		if ( pageoffset.substring( 2 ) != null ) {
       
   405 			offsettime = pageoffset.substring( 2 );
       
   406 		}
       
   407 	}
       
   408 	return offsettime;
       
   409 };
       
   410 
       
   411 IriSP.ignoreTimeFragment = function( url ){
       
   412 
       
   413 	var pageurl = url;
       
   414 	
       
   415 	if ( url.split( "#" )[1] != null ) {
       
   416 		pageurl = url.split( "#" )[0];
       
   417 	}
       
   418  
       
   419 	return pageurl;
       
   420 };
       
   421 
       
   422 
       
   423 /* code specific to jwplayer / creation and listener */
       
   424 
       
   425 IriSP.currentPosition 	= 0; 
       
   426 IriSP.currentVolume   	= 50; 
       
   427 IriSP.player 			= null;
       
   428 IriSP.startPosition 	= null;
       
   429 IriSP.firstplay	 		= false;
       
   430 
       
   431 
       
   432 
       
   433 IriSP.createPlayer = function ( url, streamerPath ) {
       
   434 	if( IriSP.config.player.type=='dailymotion' ) {
       
   435 		IriSP.config.player.src = IriSP.config.player.src+"&chromeless=1&enableApi=1";
       
   436 	} else if ( IriSP.config.player.type=='youtube' ){
       
   437 		IriSP.config.player.src = IriSP.config.player.src+"&enablejsapi=1&version=3";
       
   438 	}
       
   439 	
       
   440 	IriSP.trace( "__IriSP.createPlayer", "start" );			
       
   441 	
       
   442 	IriSP.myUrlFragment = url.split( streamerPath );	
       
   443 	
       
   444 	var configTemp = IriSP.jQuery.extend( true, {}, IriSP.config );
       
   445 	configTemp.player.flashvars.autostart =	"true";
       
   446 	configTemp.player.flashvars.streamer =	streamerPath;
       
   447 	configTemp.player.flashvars.file =	IriSP.myUrlFragment[1];
       
   448 	
       
   449 	var flashvars 		  = configTemp.player.flashvars;
       
   450 	var params 			  = configTemp.player.params;
       
   451 	var attributes 		  = configTemp.player.attributes;
       
   452 	
       
   453 	IriSP.trace(
       
   454 				  "__IriSP.createPlayer",
       
   455 				  "SWFOBJECT src:"+
       
   456 				  IriSP.config.player.src+
       
   457 				  " " +IriSP.config.gui.width+
       
   458 				  " " +IriSP.config.gui.height
       
   459 				  );
       
   460 	
       
   461 	swfobject.embedSWF(
       
   462 						IriSP.config.player.src,
       
   463 						"Ldt-PlaceHolder",
       
   464 						IriSP.config.gui.width,
       
   465 						IriSP.config.gui.height,
       
   466 						"9.0.115", // FIXME : de-hardcode version ?
       
   467 						false,
       
   468 						flashvars,
       
   469 						params,
       
   470 						attributes
       
   471 					);
       
   472 	
       
   473 	// need a methode to 
       
   474 	// re execute if this swf call does'nt work 
       
   475 };
       
   476 
       
   477 
       
   478 /* jw player api */
       
   479 IriSP.playerReady  = function (thePlayer) {
       
   480 
       
   481 	//__IriSP.trace("__IriSP.playerReady","PLAYER READY !!!!!!!!!!!!");
       
   482 	IriSP.player = window.document[thePlayer.id];
       
   483 	//__IriSP.trace("__IriSP.playerReady","API CALL "+__IriSP.player);
       
   484 	IriSP.MyApiPlayer.ready( IriSP.player );
       
   485 	//__IriSP.trace("__IriSP.playerReady","API CALL END ");
       
   486 	
       
   487 	var url = document.location.href;
       
   488 	var time = IriSP.retrieveTimeFragment( url );
       
   489 	//__IriSP.trace("__IriSP.playerReady"," "+url+" "+time );
       
   490 	IriSP.startPosition = time;
       
   491 	//__IriSP.trace("__IriSP.playerReady"," LISTENER LAUCHER");
       
   492 	IriSP.addListeners();	
       
   493 	//__IriSP.trace("__IriSP.playerReady"," LISTENER END");
       
   494 	
       
   495 };
       
   496 
       
   497 IriSP.addListeners = function () {
       
   498 	if ( IriSP.player ) { 
       
   499 		IriSP.trace("__IriSP.addListeners","ADD  Listener ");
       
   500 		IriSP.player.addModelListener( "TIME", "__IriSP.positionListener");
       
   501 		IriSP.player.addControllerListener( "VOLUME", "__IriSP.volumeListener" );
       
   502 		IriSP.player.addModelListener( 'STATE', '__IriSP.stateMonitor' );
       
   503 	} else {
       
   504 		IriSP.setTimeout( "__IriSP.addListeners()", 100 );
       
   505 	}
       
   506 
       
   507 	// et changer les boutons
       
   508 };
       
   509 
       
   510 IriSP.stateMonitor = function ( obj ) { 
       
   511 
       
   512 	 if(obj.newstate == 'PAUSED') {
       
   513 		IriSP.trace( "__IriSP.stateMonitor", "PAUSE" );
       
   514 		IriSP.MyApiPlayer.changePageUrlOffset( IriSP.currentPosition );			
       
   515 		IriSP.jQuery( ".ui-icon-play" ).css( "background-position","0px -160px" );
       
   516 		
       
   517 	} else if (obj.newstate == 'PLAYING' ){
       
   518 		
       
   519 		IriSP.trace( "__IriSP.stateMonitor", "PLAYING "+IriSP.startPosition );
       
   520 		
       
   521 		// force buffering even if autostart is disabled. 
       
   522 		if ( IriSP.config.player.flashvars.autostart == "false" && IriSP.firstplay == false && IriSP.startPosition == 0 ) {
       
   523 			IriSP.trace("__IriSP.stateMonitor","first stop ???");
       
   524 			IriSP.MyApiPlayer.play();
       
   525 			IriSP.firstplay = true;
       
   526 			IriSP.MyLdt.checkTime( 1 );
       
   527 		}
       
   528 		
       
   529 		// once that the video is loaded, move it to the correct timecode
       
   530 		if( IriSP.startPosition!=null ){
       
   531 			IriSP.MyApiPlayer.update( IriSP.startPosition );
       
   532 			IriSP.startPosition = null;
       
   533 		}
       
   534 		
       
   535 		
       
   536 		IriSP.jQuery( ".ui-icon-play" ).css( "background-position", "-16px -160px" );
       
   537 	} else if (obj.newstate == 'BUFFERING'){
       
   538 		IriSP.trace( "__IriSP.stateMonitor", "BUFFERING : "+IriSP.config.player.flashvars.autostart );
       
   539 		//changePageUrlOffset(currentPosition);
       
   540 	}
       
   541 	
       
   542 };
       
   543 
       
   544 IriSP.positionListener = function(obj) { 
       
   545 	//__IriSP.trace("__IriSP.positionListener",obj.position);
       
   546 	IriSP.currentPosition = obj.position; 
       
   547 	var tmp = document.getElementById( "posit" );
       
   548 	if (tmp) { tmp.innerHTML = "position: " + IriSP.currentPosition; }
       
   549 	IriSP.jQuery( "#slider-range-min" ).slider( "value", obj.position);
       
   550 	IriSP.jQuery( "#amount" ).val(obj.position+" s");
       
   551 	// display annotation 
       
   552 	IriSP.MyLdt.checkTime( IriSP.currentPosition );
       
   553 	
       
   554 };
       
   555 
       
   556 IriSP.volumeListener   = function (obj) { 
       
   557 	IriSP.currentVolume = obj.percentage; 
       
   558 	var tmp = document.getElementById("vol");
       
   559 	if (tmp) { tmp.innerHTML = "volume: " + IriSP.currentVolume; }
       
   560 };
       
   561 
       
   562 
       
   563 /* dailymotion api 	*/
       
   564 onDailymotionPlayerReady = function (playerid) {
       
   565 
       
   566 	//alert(playerid);
       
   567 	IriSP.player = document.getElementById( IriSP.config.player.attributes.id );
       
   568 	IriSP.MyApiPlayer.ready( IriSP.player );
       
   569 	
       
   570 	var url = document.location.href;
       
   571 	var time = IriSP.retrieveTimeFragment( url );
       
   572 	IriSP.startPosition = time;
       
   573 	IriSP.DailymotionAddListeners();	
       
   574 	
       
   575 	IriSP.MyApiPlayer.ready(playerid);
       
   576 };
       
   577 
       
   578 IriSP.DailymotionAddListeners = function () {
       
   579 	if ( IriSP.player ) { 
       
   580 		IriSP.trace( "__IriSP.addListeners","ADD  Listener " );
       
   581 		//__IriSP.player.addEventListener("onStateChange", "__IriSP.DailymotionPositionListener");
       
   582 		setTimeout( "__IriSP.DailymotionPositionListener()", 100);
       
   583 		IriSP.DailymotionPositionListener();
       
   584 		/* FIXME : works only with jwplayer */
       
   585 		IriSP.player.addModelListener( "VOLUME", "__IriSP.volumeListener" );
       
   586 		//__IriSP.player.addModelListener('STATE', '__IriSP.stateMonitor');
       
   587 	} else {
       
   588 		IriSP.setTimeout( "__IriSP.DailymotionAddListeners()", 100);
       
   589 	}
       
   590 };
       
   591 
       
   592 IriSP.DailymotionPositionListener = function() { 
       
   593 	
       
   594 	IriSP.currentPosition = IriSP.player.getCurrentTime();
       
   595 	//__IriSP.trace("__IriSP.DailymotionPositionListener",__IriSP.currentPosition);
       
   596 	//__IriSP.trace("__IriSP.currentPosition",__IriSP.currentPosition);
       
   597 	
       
   598 	IriSP.jQuery( "#slider-range-min" ).slider( "value" , IriSP.currentPosition);
       
   599 	IriSP.jQuery( "#amount" ).val( IriSP.currentPosition+" s" );
       
   600 	// afficher annotation 
       
   601 	/*__IriSP.MyLdt.checkTime(__IriSP.currentPosition);
       
   602 	*/
       
   603 	
       
   604 	setTimeout( "__IriSP.DailymotionPositionListener()", 10 );
       
   605 };
       
   606 
       
   607 /* youtube api 	*/
       
   608 onYouTubePlayerReady= function (playerid){
       
   609 
       
   610 	var url = document.location.href;
       
   611 	var time = IriSP.retrieveTimeFragment( url );
       
   612 	IriSP.player = document.getElementById( IriSP.config.player.attributes.id );
       
   613 	IriSP.startPosition = time;
       
   614 	
       
   615 	IriSP.MyApiPlayer.ready( IriSP.player );
       
   616 	
       
   617 	IriSP.MyApiPlayer.seek( time );
       
   618 	IriSP.MyApiPlayer.play();
       
   619 	
       
   620 	
       
   621 	IriSP.YouTubeAddListeners();	
       
   622 	IriSP.trace( "onYouTubePlayerReady=", time);
       
   623 	//__IriSP.MyApiPlayer.ready(playerid);
       
   624 };
       
   625 
       
   626 IriSP.YouTubeAddListeners = function () {
       
   627 	if ( IriSP.player ) { 
       
   628 		IriSP.trace( "__IriSP.addListeners", "ADD  Listener " );
       
   629 		IriSP.player.addEventListener( "onStateChange", "__IriSP.YouTubeStateMonitor" );
       
   630 		setTimeout( "__IriSP.YouTubePositionListener()", 100 );
       
   631 		
       
   632 		/* FIXME : works only with jwplayer */
       
   633 		IriSP.player.addModelListener( "VOLUME", "__IriSP.volumeListener" );
       
   634 		//__IriSP.player.addModelListener('STATE', '__IriSP.stateMonitor');
       
   635 	} else {
       
   636 	}
       
   637 };
       
   638 
       
   639 IriSP.YouTubePositionListener = function() { 
       
   640 	
       
   641 	IriSP.currentPosition = IriSP.player.getCurrentTime();
       
   642 	//__IriSP.trace("__IriSP.YouTubePositionListener",__IriSP.currentPosition);
       
   643 	//__IriSP.trace("__IriSP.currentPosition",__IriSP.currentPosition);
       
   644 	
       
   645 	IriSP.MyLdt.checkTime(IriSP.currentPosition);
       
   646 	IriSP.jQuery( "#slider-range-min" ).slider( "value", IriSP.currentPosition );
       
   647 	IriSP.jQuery( "#amount" ).val( IriSP.currentPosition+" s" );
       
   648 	// afficher annotation 
       
   649 	IriSP.MyLdt.checkTime( IriSP.currentPosition );
       
   650 	
       
   651 	
       
   652 	setTimeout( "__IriSP.YouTubePositionListener()", 10 );
       
   653 };
       
   654 
       
   655 IriSP.YouTubeStateMonitor = function (obj) { 
       
   656 	IriSP.player.addModelListener( '__IriSP.YouTubeStateMonitor ', newstate );
       
   657 	//alert(newstate+" "+obj.newstate);
       
   658 	 if(newstate == '2') {
       
   659 		IriSP.trace("__IriSP.stateMonitor","PAUSE");
       
   660 		IriSP.MyApiPlayer.changePageUrlOffset( IriSP.currentPosition );
       
   661 		
       
   662 	} else if (newstate == '1' || newstate == '1') {
       
   663 		// une fois la video prete a lire  la déplacer au bon timecode 
       
   664 		if( IriSP.startPosition!=null ) {
       
   665 			IriSP.MyApiPlayer.update( IriSP.startPosition );
       
   666 			IriSP.startPosition = null;
       
   667 		}
       
   668 	} else if (newstate == '3'){
       
   669 		IriSP.trace("__IriSP.stateMonitor","BUFFERING : ");
       
   670 		//changePageUrlOffset(currentPosition);
       
   671 	}
       
   672 	
       
   673 };
       
   674 
       
   675 
       
   676 /* 	utils */
       
   677 // code from http://stackoverflow.com/questions/822452/strip-html-from-text-javascript
       
   678 /* FIXME: maybe make it a little more robust */
       
   679 IriSP.stripHtml = function(s){
       
   680 	return s.replace(/\\&/g, '&amp;').replace(/\\</g, '&lt;').replace(/\\>/g, '&gt;').replace(/\\t/g, '&nbsp;&nbsp;&nbsp;').replace(/\\n/g, '<br />').replace(/'/g, '&#39;').replace(/"/g, '&quot;');
       
   681 };
       
   682 
       
   683 // conversion de couleur Decimal vers HexaDecimal || 000 si fff
       
   684 /* FIXME : move it somewhere else */
       
   685 IriSP.DEC_HEXA_COLOR = function (dec) {
       
   686 	 var hexa='0123456789ABCDEF',hex='';
       
   687 	 var tmp;
       
   688 	 while (dec>15){
       
   689 		  tmp = dec-(Math.floor(dec/16))*16;
       
   690 		  hex = hexa.charAt(tmp)+hex;
       
   691 		  dec = Math.floor(dec/16);
       
   692 	 }
       
   693 	 hex = hexa.charAt(dec)+hex;
       
   694 	 if (hex == "FFCC00"){ hex="";/* by default color of Ldt annotation */ }
       
   695 	 return(hex);
       
   696 };
       
   697 
       
   698 
       
   699 /* Search  methods	*/
       
   700 IriSP.SearchOldValue="";
       
   701 IriSP.searchblockOpen=false;
       
   702 IriSP.searchblock = function () {
       
   703 	IriSP.trace( "__IriSP.searchblock", IriSP.searchblockOpen );
       
   704 	
       
   705 	if ( IriSP.searchblockOpen == false ) {
       
   706 		IriSP.jQuery( ".ui-icon-search" ).css( "background-position", "-144px -112px" );
       
   707 		//__IriSP.jQuery("#LdtSearch").animate({height:26},250);
       
   708 		IriSP.jQuery("#LdtSearch").show(250);
       
   709 		/* FIXME : refactor this */
       
   710 		IriSP.jQuery("#LdtSearchInput").css('background-color','#fff');
       
   711 		IriSP.jQuery("#LdtSearchInput").focus();
       
   712 		IriSP.jQuery("#LdtSearchInput").attr('value',IriSP.SearchOldValue);
       
   713 		IriSP.Search(IriSP.SearchOldValue);
       
   714 		IriSP.searchblockOpen = true;
       
   715 	} else {
       
   716 		IriSP.SearchOldValue = IriSP.jQuery("#LdtSearchInput").attr('value');
       
   717 		IriSP.jQuery("#LdtSearchInput").attr('value','');
       
   718 		IriSP.SearchClean();
       
   719 		IriSP.jQuery(".ui-icon-search").css("background-position","-160px -112px");
       
   720 		//__IriSP.jQuery("#LdtSearch").animate({height:0},250);
       
   721 		IriSP.jQuery("#LdtSearch").hide(250);
       
   722 		IriSP.searchblockOpen = false;
       
   723 	}
       
   724 };
       
   725 
       
   726 /* Search with typeahead */
       
   727 IriSP.Search = function ( value ){
       
   728 
       
   729 	annotations = IriSP.LDTligne.annotations;
       
   730 	
       
   731 	IriSP.trace("__IriSP.Search", annotations.length+" "+value);
       
   732 	
       
   733 	var found  = 0;
       
   734 	var findmem = 0;
       
   735 	var factor  = 0;
       
   736 	IriSP.trace(value,value.length);
       
   737 	var valueS = value.toLowerCase();
       
   738 	IriSP.trace("__IriSP.Search", annotations.length+" "+valueS);
       
   739 	if(valueS.length>=3){
       
   740 		
       
   741 		for (var i=0; i < annotations.length; ++i){
       
   742 			annotation = annotations[i];
       
   743 			
       
   744 			IriSP.jQuery("#output2").text(annotation.title+" ?= "+value);
       
   745 			
       
   746 			chaine1 = annotation.title.toLowerCase();
       
   747 			chaine2 = annotation.description.toLowerCase();
       
   748 			chaine3 = annotation.htmlTags.toLowerCase();
       
   749 			
       
   750 			if(chaine1.indexOf(valueS,0) !=-1){
       
   751 				found+=1;	
       
   752 			}
       
   753 			if(chaine2.indexOf(valueS,0) !=-1){
       
   754 				found+=1;	
       
   755 			}
       
   756 			if(chaine3.indexOf(valueS,0) !=-1){
       
   757 				found+=1;	
       
   758 			}
       
   759 			
       
   760 			findmem += found;
       
   761 			if(found>0){
       
   762 				factor = found*8;
       
   763 				IriSP.jQuery("#"+annotation.id).dequeue();
       
   764 				IriSP.jQuery("#"+annotation.id).animate({height:factor},200);
       
   765 				IriSP.jQuery("#"+annotation.id).css('border','2px');
       
   766 				IriSP.jQuery("#"+annotation.id).css('border-color','red');
       
   767 				IriSP.jQuery("#"+annotation.id).animate({opacity:0.6},200);
       
   768 				
       
   769 				IriSP.trace("!!!!!!!!!!!!!!!!!!"," ?= "+annotation.id);
       
   770 				IriSP.jQuery("#LdtSearchInput").css('background-color','#e1ffe1');
       
   771 			}else {
       
   772 				IriSP.jQuery("#"+annotation.id).dequeue();
       
   773 				IriSP.jQuery("#"+annotation.id).animate({height:0},250);
       
   774 				IriSP.jQuery("#"+annotation.id).animate({opacity:0.3},200);
       
   775 			}
       
   776 			
       
   777 			found = 0;
       
   778 		}
       
   779 		if(findmem==0){
       
   780 				IriSP.jQuery("#LdtSearchInput").css('background-color','#f6f6f6');
       
   781 		}
       
   782 		
       
   783 	} else if(value.length==0){
       
   784 		IriSP.SearchClean();
       
   785 		IriSP.jQuery("#LdtSearchInput").css('background-color','#fff');		
       
   786 	} else {
       
   787 		IriSP.SearchClean();
       
   788 		IriSP.jQuery("#LdtSearchInput").css('background-color','#f6f6f6');
       
   789 	}
       
   790 };
       
   791 
       
   792 IriSP.SearchClean = function (){
       
   793 	annotations = IriSP.LDTligne.annotations;
       
   794 	
       
   795 	for (var i=0; i < annotations.length; ++i){
       
   796 			annotation = annotations[i];
       
   797 			IriSP.jQuery("#"+annotation.id).dequeue();
       
   798 			IriSP.jQuery("#"+annotation.id).animate({height:0},100);	
       
   799 			IriSP.jQuery("#"+annotation.id).css('border','0px');
       
   800 			IriSP.jQuery("#"+annotation.id).css('border-color','red');
       
   801 			IriSP.jQuery("#"+annotation.id).animate({opacity:0.3},100);
       
   802 		}
       
   803 };
       
   804 
       
   805 
       
   806 IriSP.SearchThisSegment = function (annotation){
       
   807 	/* FIXME: to implement */
       
   808 					IriSP.jQuery("#LdtSearchInput").text(annotation.title);
       
   809 					IriSP.trace("__IriSP.Ligne.prototype.checkTimeLigne",annotation.title);
       
   810 					/*__IriSP.jQuery("#Ldt-SaDescription").text(annotationTempo.description);
       
   811 					__IriSP.jQuery("#Ldt-SaKeywordText").html("Mots clefs : "+annotationTempo.htmlTags);*/
       
   812 };
       
   813 
       
   814 
       
   815 /* CLASS Ligne (annotationType) 	*/
       
   816 
       
   817 IriSP.LDTligne 	= null;		
       
   818 __IriSP.Ligne = function( id, title, description, duration ) {
       
   819 	this.id 		 = id;
       
   820 	this.title 		 = title;
       
   821 	this.description = description;
       
   822 	//
       
   823 	this.annotations = new Array();
       
   824 	this.duration = duration;
       
   825 	this.annotationOldRead = "";
       
   826 	IriSP.LDTligne = this;
       
   827 	IriSP.trace("__IriSP.Ligne","CREATE "+IriSP.LDTligne);
       
   828 };
       
   829 
       
   830 __IriSP.Ligne.prototype.addAnnotation = function ( id, begin, end, media, title, description, color, tags ) {
       
   831 	var myAnnotation = new __IriSP.Annotation(id,begin,end,media,title,description,color,tags,this.duration);
       
   832 	this.annotations.push(myAnnotation);
       
   833 	//__IriSP.trace("__IriSP.Ligne.prototype.addAnnotation  ","add annotation "+title);
       
   834 };
       
   835 
       
   836 __IriSP.Ligne.prototype.onClickLigneAnnotation = function( id ) {
       
   837 	/* TODO implement */
       
   838 	//changePageUrlOffset(currentPosition);
       
   839 	//player.sendEvent('SEEK', this.start);
       
   840 	//__IriSP.trace("SEEK",this.start);
       
   841 };
       
   842 
       
   843 __IriSP.Ligne.prototype.searchLigneAnnotation = function( id ) {
       
   844 	/* TODO implement */
       
   845 	/*for (){
       
   846 	}*/
       
   847 };
       
   848 
       
   849 __IriSP.Ligne.prototype.listAnnotations = function() {
       
   850 	/* TODO implement */
       
   851 };
       
   852 
       
   853 __IriSP.Ligne.prototype.nextAnnotation = function () {
       
   854 	
       
   855 	var annotationCibleNumber = this.numAnnotation(this.annotationOldRead)+1;
       
   856 	var annotationCible = this.annotations[annotationCibleNumber];
       
   857 
       
   858 	if( annotationCibleNumber<this.annotations.length-1 ){
       
   859 		IriSP.player.sendEvent( 'SEEK', annotationCible.begin/1000 );
       
   860 		IriSP.trace( "LIGNE  ", "| next = "+annotationCibleNumber+" - "+this.annotations.length+" | seek :"+annotationCible.begin/1000);
       
   861 	} else {
       
   862 		IriSP.player.sendEvent( 'SEEK', this.annotations[0].begin/1000);
       
   863 	}
       
   864 		
       
   865 };
       
   866 
       
   867 __IriSP.Ligne.prototype.numAnnotation = function (annotationCible){
       
   868 	for (var i=0; i < this.annotations.length; ++i){
       
   869 		if(annotationCible == this.annotations[i]){
       
   870 			return i;
       
   871 		}
       
   872 	}
       
   873 };
       
   874 
       
   875 __IriSP.Ligne.prototype.checkTime = function(time){
       
   876 	
       
   877 	var annotationTempo = -1;
       
   878 	//__IriSP.trace("__IriSP.Ligne.prototype.checkTimeLigne",time);
       
   879 	//__IriSP.trace("__IriSP.Ligne.prototype.checkTimeLigne",this.annotations.length);
       
   880 	
       
   881 	for (var i=0; i < this.annotations.length; ++i){
       
   882 		annotationTempo = this.annotations[i];	
       
   883 		
       
   884 		//__IriSP.SearchThisSegment(annotationTempo);
       
   885 		
       
   886 		if (time>annotationTempo.begin/1000 && time<annotationTempo.end/1000){
       
   887 			
       
   888 				// different form the previous
       
   889 				if(annotationTempo!=this.annotationOldRead){
       
   890 					this.annotationOldRead = annotationTempo;
       
   891 					IriSP.jQuery("#Ldt-SaTitle").text(annotationTempo.title);
       
   892 					IriSP.jQuery("#Ldt-SaDescription").text(annotationTempo.description);
       
   893 					IriSP.jQuery("#Ldt-SaKeywordText").html("Mots clefs : "+annotationTempo.htmlTags);
       
   894 					
       
   895 					//__IriSP.jQuery('#Ldt-ShowAnnotation').slideDown();
       
   896 					var startPourcent 	= annotationTempo.timeToPourcent((annotationTempo.begin*1+(annotationTempo.end*1-annotationTempo.begin*1)/2),annotationTempo.duration*1); 
       
   897 					IriSP.jQuery("#Ldt-Show-Arrow").animate({left:startPourcent+'%'},1000);
       
   898 					IriSP.jQuery("#"+annotationTempo.id).animate({alpha:'100%'},1000);
       
   899 					//alert(startPourcent);
       
   900 					var tempolinkurl  =  IriSP.ignoreTimeFragment(window.location.href)+"#t="+(this.annotations[i].begin/1000);
       
   901 				}
       
   902 			break;
       
   903 		} else {
       
   904 		annotationTempo = -1;
       
   905 		}		
       
   906 		
       
   907 	}
       
   908 	// si il y en a pas : retractation du volet 
       
   909 	if( annotationTempo == -1){
       
   910 		if(annotationTempo != this.annotationOldRead){
       
   911 			IriSP.trace("Check : ","pas d'annotation ici ");
       
   912 			IriSP.jQuery("#Ldt-SaTitle").text("");
       
   913 			IriSP.jQuery("#Ldt-SaDescription").text("");
       
   914 			IriSP.jQuery("#Ldt-SaKeywordText").html("");
       
   915 			IriSP.jQuery('#Ldt-ShowAnnotation').slideUp();
       
   916 			if(this.annotationOldRead){
       
   917 				IriSP.jQuery("#"+this.annotationOldRead.id).animate({alpha:'70%'},1000);
       
   918 			}
       
   919 			//__IriSP.jQuery("#Ldt-Show-Arrow").animate({left:'0%'},1000);
       
   920 			this.annotationOldRead = annotationTempo;
       
   921 		}
       
   922 	}
       
   923 	//__IriSP.trace("__IriSP.Ligne.prototype.checkTimeLigne",annotationTempo);
       
   924 };
       
   925 
       
   926 
       
   927 /* CLASS Annotation */
       
   928 
       
   929 __IriSP.Annotation = function (){
       
   930 	var id 	= null;
       
   931 	var begin 			= null;
       
   932 	var end 			= null;
       
   933 	var media 			= null;
       
   934 	var description	= null;
       
   935 	var title 			= null;
       
   936 	var color 			= null;
       
   937 	var tags			= null;
       
   938 	IriSP.trace("annotation ","réussi");
       
   939 };
       
   940 
       
   941 __IriSP.Annotation = function( id, begin, end, media, title, description, color, tags, duration ){
       
   942 	this.id 			= id;
       
   943 	this.begin 			= begin;
       
   944 	this.end 			= end;
       
   945 	this.media 			= media;
       
   946 	this.description 	= description;
       
   947 	this.title 			= title;
       
   948 	this.color 			= color;
       
   949 	this.tags			= tags;
       
   950 	this.htmlTags		= "";
       
   951 	this.duration		= duration;
       
   952 	// draw it 
       
   953 	this.draw();
       
   954 	this.drawTags();
       
   955 	//
       
   956 	IriSP.trace("Annotation created : ",id);
       
   957 };
       
   958 
       
   959 __IriSP.Annotation.prototype.draw = function(){
       
   960 	//alert (this.duration);
       
   961 	var startPourcent 	= this.timeToPourcent(this.begin,this.duration); // temps du media 
       
   962 	var endPourcent 	= this.timeToPourcent(this.end,this.duration)-startPourcent;
       
   963 	var divTitle		= this.title.substr(0,55);
       
   964 	
       
   965 	//IriSP.jQueryAnnotationTemplate = "<div title='"+IriSP.stripHtml(titleForDiv)+"' 
       
   966 	//id='"+this.id+"'  class='ui-slider-range ui-slider-range-min ui-widget-header iri-chapter' 
       
   967 	//width='100%' style=\"left:"+startPourcent+"%; width:"+endPourcent+"%; 
       
   968 	//padding-top:15px; border-left:solid 1px #aaaaaa; border-right:solid 1px #aaaaaa; 
       
   969 	//background:#"+IriSP.DEC_HEXA_COLOR(this.color)+";\" 
       
   970 	//onClick=\"__IriSP.MyApiPlayer.seek('"+Math.round(this.begin/1000)+"');
       
   971 	//__IriSP.jQuery('#Ldt-ShowAnnotation').slideDown();\"    ></div> ";
       
   972 	//alert(this.color+" : "+DEC_HEXA_COLOR(this.color));
       
   973 		
       
   974 	IriSP.jQueryAnnotationTemplate = Mustache.to_html(IriSP.annotation_template,
       
   975 			{"divTitle" : divTitle, "id" : this.id, "startPourcent" : startPourcent,
       
   976 			"endPourcent" : endPourcent, "hexa_color" : IriSP.DEC_HEXA_COLOR(this.color),
       
   977 			"seekPlace" : Math.round(this.begin/1000)});
       
   978 	
       
   979 	IriSP.jQuerytoolTipTemplate = Mustache.to_html(IriSP.tooltip_template, 
       
   980 				{"title" : this.title, "begin" : this.begin, "end" : this.end,
       
   981 				"description": this.description});
       
   982 	
       
   983 	
       
   984 	IriSP.jQuery("<div>"+IriSP.jQueryAnnotationTemplate+"</div>").appendTo("#Ldt-Annotations");
       
   985 	// TOOLTIP BUG ! 
       
   986 	
       
   987 	IriSP.jQuery("#"+this.id).tooltip({ effect: 'slide'});
       
   988 	
       
   989 	
       
   990 	IriSP.jQuery("#"+this.id).fadeTo(0,0.3);
       
   991 	IriSP.jQuery("#"+this.id).mouseover(function() {
       
   992 		IriSP.jQuery("#"+this.id).animate({opacity: 0.6}, 5);
       
   993 	}).mouseout(function(){		
       
   994 		IriSP.jQuery("#"+this.id).animate({opacity: 0.3}, 5);
       
   995 	});
       
   996 	IriSP.trace("__IriSP.Annotation.prototype.draw","ADD ANOTATION : "+this.begin+" "+this.end+" "+IriSP.stripHtml(this.title)+" | "+startPourcent+" | "+endPourcent+" | duration = "+this.duration);
       
   997 	
       
   998 };
       
   999 
       
  1000 __IriSP.Annotation.prototype.drawTags = function(){
       
  1001 	/* FIXME : to implement */
       
  1002 	var KeywordPattern = '<a href=\"\"> '+' </a>';
       
  1003 	
       
  1004 	//__IriSP.trace(" !? Tags : ",this.tags);
       
  1005 	
       
  1006 	if (this.tags!=undefined){
       
  1007 		for (var i = 0; i < this.tags.length; ++i){
       
  1008 			
       
  1009 			//this.htmlTags += '<span onclick=\"ShowTag('+this.tags[i]['id-ref']+');\"  > '+MyTags.getTitle(this.tags[i]['id-ref'])+' </span>'+" , ";
       
  1010 			this.htmlTags += '<span> '+IriSP.MyTags.getTitle(this.tags[i]['id-ref'])+' </span>'+" , ";
       
  1011 			
       
  1012 		}		
       
  1013 	}
       
  1014 };
       
  1015 
       
  1016 __IriSP.Annotation.prototype.tootTipAnnotation = function() {
       
  1017 	// 1 chercher le div correspondant
       
  1018 	// 2 y mettre les information
       
  1019 	return this.color + ' ' + this.type + ' apple';
       
  1020 };
       
  1021 
       
  1022 __IriSP.Annotation.prototype.onRollOverAnnotation = function (){
       
  1023 	this.tootTip();
       
  1024 };
       
  1025 
       
  1026 __IriSP.Annotation.prototype.timeToPourcent = function(time,timetotal){
       
  1027 	return (parseInt(Math.round(time/timetotal*100)));
       
  1028 };
       
  1029  
       
  1030 
       
  1031 /* CLASS Tags */
       
  1032 
       
  1033 __IriSP.Tags = function(object){
       
  1034 	this.myTags 	=	object;
       
  1035 	this.htmlTags 	= 	null;
       
  1036 	this.weigthMax 	= 	0;
       
  1037 	//this.mySegments  = 	new array();
       
  1038 };
       
  1039 
       
  1040 __IriSP.Tags.prototype.addAnnotation = function (annotation){
       
  1041 	for (var i = 0; i < this.myTags.length; ++i){
       
  1042 		this.myTags[i].mySegments = new Array(); 
       
  1043 		if (annotation.tags!=null){
       
  1044 			for (var j = 0; j < annotation.tags.length; ++j){
       
  1045 				if (this.myTags[i]['id'] == annotation.tags[j]['id-ref']){
       
  1046 					this.myTags[i].mySegments.push([annotation.begin,annotation.end,annotation.id]);
       
  1047 					var weigthTempo = this.myTags[i].mySegments.length;
       
  1048 					var tempo = this.myTags[i].mySegments[weigthTempo-1];
       
  1049 					//__IriSP.trace ("__IriSP.Tags.prototype.addAnnotation ","  "+this.myTags[i]['meta']['dc:title']+" "+this.myTags[i]['id']+" : "+tempo[0]+" - "+tempo[1]);
       
  1050 					
       
  1051 					if (this.weigthMax < weigthTempo ){
       
  1052 						this.weigthMax = weigthTempo;
       
  1053 					}
       
  1054 				}
       
  1055 			}
       
  1056 		}
       
  1057 	}
       
  1058 };
       
  1059 
       
  1060 __IriSP.Tags.prototype.getTitle = function (id){
       
  1061 	for (var i = 0; i < this.myTags.length; ++i){
       
  1062 		if(this.myTags[i]['id']==id){
       
  1063 			return(this.myTags[i]['meta']['dc:title']);
       
  1064 		}
       
  1065 	}
       
  1066 
       
  1067 };
       
  1068 
       
  1069 __IriSP.Tags.prototype.draw = function (){
       
  1070 
       
  1071 	IriSP.trace("__IriSP.Tags.prototype.draw"," !!! WELL START " );
       
  1072 	for (var i = 0; i < this.myTags.length; ++i){
       
  1073 		IriSP.trace("__IriSP.Tags.prototype.draw"," ADD Tags : "+this.myTags[i]['id']);
       
  1074 		if(this.myTags[i]['id']!=null){
       
  1075 		this.htmlTags += '<span onclick=\"MyTags.show( \''+this.myTags[i]['id']
       
  1076 						+'\');\" style=\"font-size:'  +((this.myTags[i].mySegments.length/this.weigthMax*10)+8)
       
  1077 						+'px;\" alt=\"'+this.myTags[i].mySegments.length
       
  1078 						+'\"> '+this.myTags[i]['meta']['dc:title']+' </span>'+' , ';
       
  1079 		}
       
  1080 	}
       
  1081 	
       
  1082 	IriSP.jQuery('#Ldt-Tags').html(this.htmlTags);
       
  1083 	IriSP.trace("__IriSP.Tags.prototype.draw"," !!!!  END WMAX= "+this.weigthMax );
       
  1084 	
       
  1085 };
       
  1086 
       
  1087 __IriSP.Tags.prototype.show = function (id){
       
  1088 	
       
  1089 	var timeStartOffsetA	=	100000000000000000000;
       
  1090 	var timeStartOffsetB	=	100000000000000000000;
       
  1091 	var timeEndOffsetA		=	0;
       
  1092 	var timeEndOffsetB		=	0;
       
  1093 	var timeStartID;
       
  1094 	var timeEndID;
       
  1095 	var WidthPourCent;
       
  1096 	var leftPourCent;
       
  1097 	var timeStartOffset;
       
  1098 	
       
  1099 	// case 1 : seul segment 
       
  1100 	// case 2 : 2 ou X segments 
       
  1101 	
       
  1102 	
       
  1103 	for (var i = 0; i < this.myTags.length; ++i){
       
  1104 		if (this.myTags[i]['id']==id){
       
  1105 			IriSP.trace("######### TAG DRAWing : "," END" );		
       
  1106 			
       
  1107 			for (var j = 0; j < this.myTags[i].mySegments.length; ++j){
       
  1108 				if(timeStartOffset> this.myTags[i].mySegments[j][0]){
       
  1109 					timeStartOffsetA = this.myTags[i].mySegments[j][0];
       
  1110 					timeStartOffsetB = this.myTags[i].mySegments[j][1];
       
  1111 					timeStartID		 = this.myTags[i].mySegments[j][2]
       
  1112 				}
       
  1113 				if(timeStartOffset> this.myTags[i].mySegments[j][0]){
       
  1114 					timeEndOffsetA  = this.myTags[i].mySegments[j][0];
       
  1115 					timeEndOffsetB  = this.myTags[i].mySegments[j][1];
       
  1116 					timeEndID		= this.myTags[i].mySegments[j][2]
       
  1117 				}
       
  1118 			}
       
  1119 			
       
  1120 		}
       
  1121 	}
       
  1122 	
       
  1123 	// -------------------------------------------------
       
  1124 	// 
       
  1125 	// -------------------------------------------------
       
  1126 	
       
  1127 	leftPourCent 	= IriSP.timeToPourcent((timeStartOffsetA*1+(timeStartOffsetB-timeStartOffsetA)/2),IriSP.MyLdt.duration); 
       
  1128 	WidthPourCent	= IriSP.timeToPourcent((timeEndOffsetA*1+(timeEndOffsetB-timeEndOffsetA)/2),IriSP.MyLdt.duration)-leftPourCent; 			
       
  1129 	//WidthPourCent	= timeToPourcent((timeEndOffsetA*1+(timeEndOffsetB-timeEndOffsetA)/2),MyLdt.duration)-startPourcent; 			
       
  1130 	IriSP.jQuery("#Ldt-Show-Tags").css('left',leftPourCent+'%');
       
  1131 	IriSP.jQuery("#Ldt-Show-Tags").css('width',WidthPourCent+'%');
       
  1132 	IriSP.jQuery("#Ldt-Show-Tags").text('joijoij');
       
  1133 	// like arrow script
       
  1134 	
       
  1135 	
       
  1136 	
       
  1137 };
       
  1138 
       
  1139 
       
  1140 IriSP.annotation_template = "<div title='{{divTitle}}' id='{{id}}'	class='ui-slider-range ui-slider-range-min ui-widget-header iri-chapter' 	width='100%' 	style='left: {{startPourcent}}%; width: {{endPourcent}}%; padding-top:15px; border-left:solid 1px #aaaaaa; border-right:solid 1px #aaaaaa; background:#{{hexa_color}};' 	onClick='IriSP.MyApiPlayer.seek({{seekPlace}});IriSP.jQuery(\"#Ldt-ShowAnnotation\").slideDown();'></div>";
       
  1141 IriSP.annotation_loading_template = "<div id='Ldt-load-container'><div id='Ldt-loader'>&nbsp;</div> Chargement... </div>";
       
  1142 IriSP.radio_template = "<div id='Ldt-Root'>	<div id='Ldt-PlaceHolder'>		<a href='http://www.adobe.com/go/getflashplayer'>Get flash</a> to see		this player	</div>	<div id='Ldt-controler' class='demo'>		<div class='Ldt-Control1'>			<button id='ldt-CtrlPlay' onclick='__IriSP.MyApiPlayer.play()'>Lecture				/ Pause</button>			<button id='ldt-CtrlNext' onclick='__IriSP.MyLdt.nextAnnotation()'>Suivant</button>		</div>		<div id='Ldt-Annotations' class='ui-slider'>			<div id='slider-range-min'></div>		</div>		<div class='Ldt-Control2'>			<button id='ldt-CtrlLink' onclick='__IriSP.searchblock()'>				Rechercher</button>			<button id='ldt-CtrlSound' onclick='__IriSP.MyApiPlayer.mute()'>Sound</button>		</div>		<div class='cleaner'>&nbsp;</div>		<div id='Ldt-Show-Arrow-container'>			<div id='Ldt-Show-Arrow'></div>		</div>	</div>	<div>		<div id='ldt-Show'></div>		<div id='Ldt-ShowAnnotation-audio' class='demo'>			<div id='Ldt-SaTitle'></div>			<div id='Ldt-SaDescription'></div>			<div class='cleaner'>				<!--&nbsp\;-->			</div>		</div>		<div id='Ldt-SaKeyword'>			<div id='Ldt-SaKeywordText'></div>			<div class='cleaner'></div>			<div id='Ldt-SaShareTools'>{{{share_template}}}</div>			<div class='cleaner'></div>		</div>		<div id='Ldt-Tags'>Mots clefs :</div>	</div>	<div id='Ldt-output' style='clear: left; float: none; position: relative; height: 200px; width: {{width}}px; overflow: scroll;'>	</div>";
       
  1143 IriSP.search_template = "<div id='LdtSearchContainer'	style='margin-left: 445px; position: absolute;'>	<div id='LdtSearch'		style='display: none; background-color: #EEE; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center;'>		<input id='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	</div></div><div class='cleaner'></div>";
       
  1144 IriSP.share_template = "<a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'><span class='share shareDelicious'>&nbsp;</span></a>		<a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> <span class='share shareFacebook'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'>  <span class='share shareTwitter'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'>  <span class='share shareMySpace'>&nbsp;</span></a>";
       
  1145 IriSP.tooltip_template = " <div class='Ldt-tooltip'><div class='title'>{{title}}</div><div class='time'>{{begin}} : {{end}} </div><div class='description'>{{description}}</div></div>";
       
  1146 IriSP.video_template = "<div id='LdtSearchContainer'	style='margin-top: {{heightS}} px; margin-left: 445px; position: absolute;'>	<div id='LdtSearch'		style='background-color: #EEE; display: none; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center; z-index: 999;'>		<input id='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	</div></div><div id='Ldt-Root'>	<div id='Ldt-PlaceHolder'>		<a href='http://www.adobe.com/go/getflashplayer'>Get flash</a> to see		this player	</div>	<div id='Ldt-controler' class='demo'>		<div class='Ldt-Control1'>			<button id='ldt-CtrlPlay' onclick='__IriSP.MyApiPlayer.play()'>Lecture				/ Pause</button>			<button id='ldt-CtrlNext' onclick='__IriSP.MyLdt.nextAnnotation()'>Suivant</button>		</div>		<div id='Ldt-Annotations' class='ui-slider'>			<div id='slider-range-min'></div>		</div>		<div class='Ldt-Control2'>			<button id='ldt-CtrlLink' onclick='__IriSP.searchblock()'>				Rechercher</button>			<button id='ldt-CtrlSound' onclick='__IriSP.MyApiPlayer.mute()'>Sound</button>		</div>		<div class='cleaner'>&nbsp\;</div>		<div id='Ldt-Show-Arrow-container'>			<div id='Ldt-Show-Arrow'></div>		</div>	</div>	<div>		<div id='ldt-Show'></div>		<div id='Ldt-ShowAnnotation-audio' class='demo'>			<div id='Ldt-SaTitle'></div>			<div id='Ldt-SaDescription'></div>			<div class='cleaner'>				<!--&nbsp\;-->			</div>		</div>		<div id='Ldt-SaKeyword'>			<div id='Ldt-SaKeywordText'></div>			<div class='cleaner'></div>			<div id='Ldt-SaShareTools'>{{{share_template}}}</div>			<div class='cleaner'></div>		</div>		<div id='Ldt-Tags'>Mots clefs :</div>	</div>	<div id='Ldt-output'></div>";/*
       
  1147   mustache.js — Logic-less templates in JavaScript
       
  1148 
       
  1149   See http://mustache.github.com/ for more info.
       
  1150 */
       
  1151 
       
  1152 var Mustache = function() {
       
  1153   var Renderer = function() {};
       
  1154 
       
  1155   Renderer.prototype = {
       
  1156     otag: "{{",
       
  1157     ctag: "}}",
       
  1158     pragmas: {},
       
  1159     buffer: [],
       
  1160     pragmas_implemented: {
       
  1161       "IMPLICIT-ITERATOR": true
       
  1162     },
       
  1163     context: {},
       
  1164 
       
  1165     render: function(template, context, partials, in_recursion) {
       
  1166       // reset buffer & set context
       
  1167       if(!in_recursion) {
       
  1168         this.context = context;
       
  1169         this.buffer = []; // TODO: make this non-lazy
       
  1170       }
       
  1171 
       
  1172       // fail fast
       
  1173       if(!this.includes("", template)) {
       
  1174         if(in_recursion) {
       
  1175           return template;
       
  1176         } else {
       
  1177           this.send(template);
       
  1178           return;
       
  1179         }
       
  1180       }
       
  1181 
       
  1182       template = this.render_pragmas(template);
       
  1183       var html = this.render_section(template, context, partials);
       
  1184       if(in_recursion) {
       
  1185         return this.render_tags(html, context, partials, in_recursion);
       
  1186       }
       
  1187 
       
  1188       this.render_tags(html, context, partials, in_recursion);
       
  1189     },
       
  1190 
       
  1191     /*
       
  1192       Sends parsed lines
       
  1193     */
       
  1194     send: function(line) {
       
  1195       if(line !== "") {
       
  1196         this.buffer.push(line);
       
  1197       }
       
  1198     },
       
  1199 
       
  1200     /*
       
  1201       Looks for %PRAGMAS
       
  1202     */
       
  1203     render_pragmas: function(template) {
       
  1204       // no pragmas
       
  1205       if(!this.includes("%", template)) {
       
  1206         return template;
       
  1207       }
       
  1208 
       
  1209       var that = this;
       
  1210       var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
       
  1211             this.ctag, "g");
       
  1212       return template.replace(regex, function(match, pragma, options) {
       
  1213         if(!that.pragmas_implemented[pragma]) {
       
  1214           throw({message: 
       
  1215             "This implementation of mustache doesn't understand the '" +
       
  1216             pragma + "' pragma"});
       
  1217         }
       
  1218         that.pragmas[pragma] = {};
       
  1219         if(options) {
       
  1220           var opts = options.split("=");
       
  1221           that.pragmas[pragma][opts[0]] = opts[1];
       
  1222         }
       
  1223         return "";
       
  1224         // ignore unknown pragmas silently
       
  1225       });
       
  1226     },
       
  1227 
       
  1228     /*
       
  1229       Tries to find a partial in the curent scope and render it
       
  1230     */
       
  1231     render_partial: function(name, context, partials) {
       
  1232       name = this.trim(name);
       
  1233       if(!partials || partials[name] === undefined) {
       
  1234         throw({message: "unknown_partial '" + name + "'"});
       
  1235       }
       
  1236       if(typeof(context[name]) != "object") {
       
  1237         return this.render(partials[name], context, partials, true);
       
  1238       }
       
  1239       return this.render(partials[name], context[name], partials, true);
       
  1240     },
       
  1241 
       
  1242     /*
       
  1243       Renders inverted (^) and normal (#) sections
       
  1244     */
       
  1245     render_section: function(template, context, partials) {
       
  1246       if(!this.includes("#", template) && !this.includes("^", template)) {
       
  1247         return template;
       
  1248       }
       
  1249 
       
  1250       var that = this;
       
  1251       // CSW - Added "+?" so it finds the tighest bound, not the widest
       
  1252       var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
       
  1253               "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
       
  1254               "\\s*", "mg");
       
  1255 
       
  1256       // for each {{#foo}}{{/foo}} section do...
       
  1257       return template.replace(regex, function(match, type, name, content) {
       
  1258         var value = that.find(name, context);
       
  1259         if(type == "^") { // inverted section
       
  1260           if(!value || that.is_array(value) && value.length === 0) {
       
  1261             // false or empty list, render it
       
  1262             return that.render(content, context, partials, true);
       
  1263           } else {
       
  1264             return "";
       
  1265           }
       
  1266         } else if(type == "#") { // normal section
       
  1267           if(that.is_array(value)) { // Enumerable, Let's loop!
       
  1268             return that.map(value, function(row) {
       
  1269               return that.render(content, that.create_context(row),
       
  1270                 partials, true);
       
  1271             }).join("");
       
  1272           } else if(that.is_object(value)) { // Object, Use it as subcontext!
       
  1273             return that.render(content, that.create_context(value),
       
  1274               partials, true);
       
  1275           } else if(typeof value === "function") {
       
  1276             // higher order section
       
  1277             return value.call(context, content, function(text) {
       
  1278               return that.render(text, context, partials, true);
       
  1279             });
       
  1280           } else if(value) { // boolean section
       
  1281             return that.render(content, context, partials, true);
       
  1282           } else {
       
  1283             return "";
       
  1284           }
       
  1285         }
       
  1286       });
       
  1287     },
       
  1288 
       
  1289     /*
       
  1290       Replace {{foo}} and friends with values from our view
       
  1291     */
       
  1292     render_tags: function(template, context, partials, in_recursion) {
       
  1293       // tit for tat
       
  1294       var that = this;
       
  1295 
       
  1296       var new_regex = function() {
       
  1297         return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
       
  1298           that.ctag + "+", "g");
       
  1299       };
       
  1300 
       
  1301       var regex = new_regex();
       
  1302       var tag_replace_callback = function(match, operator, name) {
       
  1303         switch(operator) {
       
  1304         case "!": // ignore comments
       
  1305           return "";
       
  1306         case "=": // set new delimiters, rebuild the replace regexp
       
  1307           that.set_delimiters(name);
       
  1308           regex = new_regex();
       
  1309           return "";
       
  1310         case ">": // render partial
       
  1311           return that.render_partial(name, context, partials);
       
  1312         case "{": // the triple mustache is unescaped
       
  1313           return that.find(name, context);
       
  1314         default: // escape the value
       
  1315           return that.escape(that.find(name, context));
       
  1316         }
       
  1317       };
       
  1318       var lines = template.split("\n");
       
  1319       for(var i = 0; i < lines.length; i++) {
       
  1320         lines[i] = lines[i].replace(regex, tag_replace_callback, this);
       
  1321         if(!in_recursion) {
       
  1322           this.send(lines[i]);
       
  1323         }
       
  1324       }
       
  1325 
       
  1326       if(in_recursion) {
       
  1327         return lines.join("\n");
       
  1328       }
       
  1329     },
       
  1330 
       
  1331     set_delimiters: function(delimiters) {
       
  1332       var dels = delimiters.split(" ");
       
  1333       this.otag = this.escape_regex(dels[0]);
       
  1334       this.ctag = this.escape_regex(dels[1]);
       
  1335     },
       
  1336 
       
  1337     escape_regex: function(text) {
       
  1338       // thank you Simon Willison
       
  1339       if(!arguments.callee.sRE) {
       
  1340         var specials = [
       
  1341           '/', '.', '*', '+', '?', '|',
       
  1342           '(', ')', '[', ']', '{', '}', '\\'
       
  1343         ];
       
  1344         arguments.callee.sRE = new RegExp(
       
  1345           '(\\' + specials.join('|\\') + ')', 'g'
       
  1346         );
       
  1347       }
       
  1348       return text.replace(arguments.callee.sRE, '\\$1');
       
  1349     },
       
  1350 
       
  1351     /*
       
  1352       find `name` in current `context`. That is find me a value
       
  1353       from the view object
       
  1354     */
       
  1355     find: function(name, context) {
       
  1356       name = this.trim(name);
       
  1357 
       
  1358       // Checks whether a value is thruthy or false or 0
       
  1359       function is_kinda_truthy(bool) {
       
  1360         return bool === false || bool === 0 || bool;
       
  1361       }
       
  1362 
       
  1363       var value;
       
  1364       if(is_kinda_truthy(context[name])) {
       
  1365         value = context[name];
       
  1366       } else if(is_kinda_truthy(this.context[name])) {
       
  1367         value = this.context[name];
       
  1368       }
       
  1369 
       
  1370       if(typeof value === "function") {
       
  1371         return value.apply(context);
       
  1372       }
       
  1373       if(value !== undefined) {
       
  1374         return value;
       
  1375       }
       
  1376       // silently ignore unkown variables
       
  1377       return "";
       
  1378     },
       
  1379 
       
  1380     // Utility methods
       
  1381 
       
  1382     /* includes tag */
       
  1383     includes: function(needle, haystack) {
       
  1384       return haystack.indexOf(this.otag + needle) != -1;
       
  1385     },
       
  1386 
       
  1387     /*
       
  1388       Does away with nasty characters
       
  1389     */
       
  1390     escape: function(s) {
       
  1391       s = String(s === null ? "" : s);
       
  1392       return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
       
  1393         switch(s) {
       
  1394         case "&": return "&amp;";
       
  1395         case "\\": return "\\\\";
       
  1396         case '"': return '&quot;';
       
  1397         case "'": return '&#39;';
       
  1398         case "<": return "&lt;";
       
  1399         case ">": return "&gt;";
       
  1400         default: return s;
       
  1401         }
       
  1402       });
       
  1403     },
       
  1404 
       
  1405     // by @langalex, support for arrays of strings
       
  1406     create_context: function(_context) {
       
  1407       if(this.is_object(_context)) {
       
  1408         return _context;
       
  1409       } else {
       
  1410         var iterator = ".";
       
  1411         if(this.pragmas["IMPLICIT-ITERATOR"]) {
       
  1412           iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
       
  1413         }
       
  1414         var ctx = {};
       
  1415         ctx[iterator] = _context;
       
  1416         return ctx;
       
  1417       }
       
  1418     },
       
  1419 
       
  1420     is_object: function(a) {
       
  1421       return a && typeof a == "object";
       
  1422     },
       
  1423 
       
  1424     is_array: function(a) {
       
  1425       return Object.prototype.toString.call(a) === '[object Array]';
       
  1426     },
       
  1427 
       
  1428     /*
       
  1429       Gets rid of leading and trailing whitespace
       
  1430     */
       
  1431     trim: function(s) {
       
  1432       return s.replace(/^\s*|\s*$/g, "");
       
  1433     },
       
  1434 
       
  1435     /*
       
  1436       Why, why, why? Because IE. Cry, cry cry.
       
  1437     */
       
  1438     map: function(array, fn) {
       
  1439       if (typeof array.map == "function") {
       
  1440         return array.map(fn);
       
  1441       } else {
       
  1442         var r = [];
       
  1443         var l = array.length;
       
  1444         for(var i = 0; i < l; i++) {
       
  1445           r.push(fn(array[i]));
       
  1446         }
       
  1447         return r;
       
  1448       }
       
  1449     }
       
  1450   };
       
  1451 
       
  1452   return({
       
  1453     name: "mustache.js",
       
  1454     version: "0.3.1-dev",
       
  1455 
       
  1456     /*
       
  1457       Turns a template and view into HTML
       
  1458     */
       
  1459     to_html: function(template, view, partials, send_fun) {
       
  1460       var renderer = new Renderer();
       
  1461       if(send_fun) {
       
  1462         renderer.send = send_fun;
       
  1463       }
       
  1464       renderer.render(template, view, partials);
       
  1465       if(!send_fun) {
       
  1466         return renderer.buffer.join("\n");
       
  1467       }
       
  1468     }
       
  1469   });
       
  1470 }();
       
  1471 /* utils.js - various utils that don't belong anywhere else */
       
  1472 
       
  1473 /* trace function, for debugging */
       
  1474 
       
  1475 IriSP.traceNum = 0;
       
  1476 IriSP.trace = function( msg, value ) {
       
  1477 
       
  1478 	if( IriSP.config.gui.debug === true ) {
       
  1479 		IriSP.traceNum += 1;
       
  1480 		IriSP.jQuery( "<div>"+IriSP.traceNum+" - "+msg+" : "+value+"</div>" ).appendTo( "#Ldt-output" );
       
  1481 	}
       
  1482 };
       
  1483 
       
  1484 /* data.js - this file deals with how the players gets and sends data */
       
  1485 
       
  1486 IriSP.getMetadata = function() {
       
  1487 	
       
  1488 	IriSP.jQuery.ajax({
       
  1489 		  dataType: IriSP.config.metadata.load,
       
  1490 		  url:IriSP.config.metadata.src,
       
  1491 		  success : function( json ){
       
  1492 		  
       
  1493 				IriSP.trace( "ajax", "success" );
       
  1494 				
       
  1495 				// START PARSING ----------------------- 
       
  1496 				if( json === "" ){
       
  1497 					alert( "Json load error" );
       
  1498 				} else {							  							  
       
  1499 					// # CREATE MEDIA  							//
       
  1500 					// # JUSTE ONE PLAYER FOR THE MOMENT		//
       
  1501 					//__IriSP.jQuery("<div></div>").appendTo("#output");
       
  1502 					var MyMedia = new  __IriSP.Media(
       
  1503 														json.medias[0].id,
       
  1504 														json.medias[0].href,
       
  1505 														json.medias[0]['meta']['dc:duration'],
       
  1506 														json.medias[0]['dc:title'],
       
  1507 														json.medias[0]['dc:description']);
       
  1508 					
       
  1509 					IriSP.trace( "__IriSP.MyApiPlayer",
       
  1510 														IriSP.config.gui.width+"   "
       
  1511 														+ IriSP.config.gui.height + " "
       
  1512 														+ json.medias[0].href + " "
       
  1513 														+ json.medias[0]['meta']['dc:duration'] + " "
       
  1514 														+ json.medias[0]['meta']['item']['value']);
       
  1515 					
       
  1516 					// Create APIplayer
       
  1517 					IriSP.MyApiPlayer = new __IriSP.APIplayer (
       
  1518 														IriSP.config.gui.width,
       
  1519 														IriSP.config.gui.height,
       
  1520 														json.medias[0].href,
       
  1521 														json.medias[0]['meta']['dc:duration'],
       
  1522 														json.medias[0]['meta']['item']['value']);
       
  1523 				
       
  1524 					// # CREATE THE FIRST LINE  				//
       
  1525 					IriSP.trace( "__IriSP.init.main","__IriSP.Ligne" );
       
  1526 					IriSP.MyLdt = new __IriSP.Ligne(
       
  1527 														json['annotation-types'][0].id,
       
  1528 														json['annotation-types'][0]['dc:title'],
       
  1529 														json['annotation-types'][0]['dc:description'],
       
  1530 														json.medias[0]['meta']['dc:duration']);			
       
  1531 					
       
  1532 					// CREATE THE TAG CLOUD 					//
       
  1533 					IriSP.trace( "__IriSP.init.main","__IriSP.Tags" );
       
  1534 					IriSP.MyTags =  new __IriSP.Tags( json.tags );
       
  1535 				
       
  1536 					// CREATE THE ANNOTATIONS  				    //
       
  1537 					// JUSTE FOR THE FIRST TYPE   			 	//
       
  1538 					/* FIXME: make it support more than one ligne de temps */
       
  1539 					IriSP.jQuery.each( json.annotations, function(i,item) {
       
  1540 						if (item.meta['id-ref'] == IriSP.MyLdt.id) {
       
  1541 							//__IriSP.trace("__IriSP.init.main","__IriSP.MyLdt.addAnnotation");
       
  1542 							IriSP.MyLdt.addAnnotation(
       
  1543 										item.id,
       
  1544 										item.begin,
       
  1545 										item.end,
       
  1546 										item.media,
       
  1547 										item.content.title,
       
  1548 										item.content.description,
       
  1549 										item.content.color,
       
  1550 										item.tags);
       
  1551 						}
       
  1552 							//MyTags.addAnnotation(item);
       
  1553 					} );	
       
  1554 					IriSP.jQuery.each( json.lists, function(i,item) {
       
  1555 						IriSP.trace("lists","");
       
  1556 					} );	
       
  1557 					IriSP.jQuery.each( json.views, function(i,item) {
       
  1558 						IriSP.trace("views","");
       
  1559 					} );	
       
  1560 				}
       
  1561 				// END PARSING ----------------------- //  
       
  1562 			
       
  1563 							
       
  1564 		}, error : function(data){
       
  1565 			  alert("ERROR : "+data);
       
  1566 		}
       
  1567 	  });	
       
  1568 
       
  1569 }/* site.js - all our site-dependent config : player chrome, cdn locations, etc...*/
       
  1570 
       
  1571 IriSP.lib = { 
       
  1572 		jQuery:"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js",
       
  1573 		jQueryUI:"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js",
       
  1574 		jQueryToolTip:"http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js",
       
  1575 		swfObject:"http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
       
  1576 		cssjQueryUI:"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css"
       
  1577 };
       
  1578 
       
  1579 //Player Configuration 
       
  1580 IriSP.config = undefined;
       
  1581 IriSP.configDefault = {
       
  1582 		metadata:{
       
  1583 			format:'cinelab',
       
  1584 			src:'',
       
  1585 			load:'jsonp'
       
  1586 		},
       
  1587 		gui:{
       
  1588 			width:650,
       
  1589 			height:0,
       
  1590 			mode:'radio',
       
  1591 			container:'LdtPlayer',
       
  1592 			debug:false, 
       
  1593 			css:'../src/css/LdtPlayer.css'
       
  1594 		},
       
  1595 		player:{
       
  1596 			type:'jwplayer',
       
  1597 			src:'../res/swf/player.swf',
       
  1598 			params:{
       
  1599 				allowfullscreen:"true", 
       
  1600 				allowscriptaccess:"always",
       
  1601 				wmode:"transparent"
       
  1602 			},
       
  1603 			flashvars:{
       
  1604 				streamer:"streamer",
       
  1605 				file:"file", 
       
  1606 				live:"true",
       
  1607 				autostart:"false",
       
  1608 				controlbar:"none",
       
  1609 				playerready:"IriSP.playerReady"
       
  1610 			},
       
  1611 			attributes:{
       
  1612 				id:"Ldtplayer1",  
       
  1613 				name:"Ldtplayer1"
       
  1614 			}
       
  1615 		},
       
  1616 		module:null
       
  1617 };
       
  1618 
       
  1619 /* ui.js - ui related functions */
       
  1620 
       
  1621 /* FIXME: use an sharing library */
       
  1622 IriSP.LdtShareTool = IriSP.share_template; /* the contents come from share.html */
       
  1623 
       
  1624 IriSP.createPlayerChrome = function(){
       
  1625 	var width = IriSP.config.gui.width;
       
  1626 	var height = IriSP.config.gui.height;
       
  1627 	var heightS = IriSP.config.gui.height-20;
       
  1628 	
       
  1629 	// AUDIO  */
       
  1630 	// PB dans le html : ; 
       
  1631 	IriSP.trace( "__IriSP.createMyHtml",IriSP.config.gui.container );
       
  1632 
       
  1633 	
       
  1634 	/* FIXME : factor this in another file */
       
  1635 	if( IriSP.config.gui.mode=="radio" ){
       
  1636 
       
  1637 		IriSP.jQuery( "#"+IriSP.config.gui.container ).before(IriSP.search_template);
       
  1638 		var radioPlayer = Mustache.to_html(IriSP.radio_template, {"share_template" : IriSP.share_template});
       
  1639 		IriSP.jQuery(radioPlayer).appendTo("#"+IriSP.config.gui.container);
       
  1640 
       
  1641 		// special tricks for IE 7
       
  1642 		if (IriSP.jQuery.browser.msie==true && IriSP.jQuery.browser.version=="7.0"){
       
  1643 			//LdtSearchContainer
       
  1644 			//__IriSP.jQuery("#LdtPlayer").attr("margin-top","50px");
       
  1645 			IriSP.jQuery("#Ldt-Root").css("padding-top","25px");
       
  1646 			IriSP.trace("__IriSP.createHtml","IE7 SPECIAL ");
       
  1647 		}
       
  1648 	} else if(IriSP.config.gui.mode=="video") {
       
  1649 	
       
  1650 		var videoPlayer = Mustache.to_html(IriSP.video_template, {"share_template" : IriSP.share_template, "heightS" : heightS});
       
  1651 		IriSP.jQuery(videoPlayer).appendTo("#"+IriSP.config.gui.container);
       
  1652 	}
       
  1653 	
       
  1654 	/* FIXME : move it elsewhere */
       
  1655 	IriSP.trace("__IriSP.createHtml",IriSP.jQuery.browser.msie+" "+IriSP.jQuery.browser.version);		
       
  1656 	IriSP.trace("__IriSP.createHtml","end");
       
  1657 	IriSP.jQuery("#Ldt-Annotations").width(width-(75*2));
       
  1658 	IriSP.jQuery("#Ldt-Show-Arrow-container").width(width-(75*2));
       
  1659 	IriSP.jQuery("#Ldt-ShowAnnotation-audio").width(width-10);
       
  1660 	IriSP.jQuery("#Ldt-ShowAnnotation-video").width(width-10);
       
  1661 	IriSP.jQuery("#Ldt-SaKeyword").width(width-10);
       
  1662 	IriSP.jQuery("#Ldt-controler").width(width-10);
       
  1663 	IriSP.jQuery("#Ldt-Control").attr("z-index","100");
       
  1664 	IriSP.jQuery("#Ldt-controler").hide();
       
  1665 	
       
  1666 	IriSP.jQuery(IriSP.annotation_loading_template).appendTo("#Ldt-ShowAnnotation-audio");
       
  1667 
       
  1668 	if(IriSP.config.gui.mode=='radio'){
       
  1669 		IriSP.jQuery("#Ldt-load-container").attr("width",IriSP.config.gui.width);
       
  1670 	}
       
  1671 	// Show or not the output
       
  1672 	if(IriSP.config.gui.debug===true){
       
  1673 		IriSP.jQuery("#Ldt-output").show();
       
  1674 	} else {
       
  1675 		IriSP.jQuery("#Ldt-output").hide();
       
  1676 	}
       
  1677 	
       
  1678 };
       
  1679 
       
  1680 
       
  1681 /* create the buttons and the slider   */
       
  1682 IriSP.createInterface = function( width, height, duration ) {
       
  1683 		
       
  1684 		IriSP.jQuery( "#Ldt-controler" ).show();
       
  1685 		//__IriSP.jQuery("#Ldt-Root").css('display','visible');
       
  1686 		IriSP.trace( "__IriSP.createInterface" , width+","+height+","+duration+"," );
       
  1687 		
       
  1688 		IriSP.jQuery( "#Ldt-ShowAnnotation").click( function () { 
       
  1689 			 //__IriSP.jQuery(this).slideUp(); 
       
  1690 		} );
       
  1691 
       
  1692 		var LdtpPlayerY = IriSP.jQuery("#Ldt-PlaceHolder").attr("top");
       
  1693 		var LdtpPlayerX = IriSP.jQuery("#Ldt-PlaceHolder").attr("left");
       
  1694 		
       
  1695 		IriSP.jQuery( "#slider-range-min" ).slider( { //range: "min",
       
  1696 			value: 0,
       
  1697 			min: 1,
       
  1698 			max: duration/1000,//1:54:52.66 = 3600+3240+
       
  1699 			step: 0.1,
       
  1700 			slide: function(event, ui) {
       
  1701 				
       
  1702 				//__IriSP.jQuery("#amount").val(ui.value+" s");
       
  1703 				//player.sendEvent('SEEK', ui.value)
       
  1704 				IriSP.MyApiPlayer.seek(ui.value);
       
  1705 				//changePageUrlOffset(ui.value);
       
  1706 				//player.sendEvent('PAUSE')
       
  1707 			}
       
  1708 		} );
       
  1709 		
       
  1710 		IriSP.trace("__IriSP.createInterface","ICI");
       
  1711 		IriSP.jQuery("#amount").val(IriSP.jQuery("#slider-range-min").slider("value")+" s");
       
  1712 		IriSP.jQuery(".Ldt-Control1 button:first").button({
       
  1713 			icons: {
       
  1714 				primary: 'ui-icon-play'
       
  1715 			},
       
  1716 			text: false
       
  1717 		}).next().button({
       
  1718 			icons: {
       
  1719 				primary: 'ui-icon-seek-next'
       
  1720 			},
       
  1721 			 text: false
       
  1722 		});
       
  1723 		IriSP.jQuery(".Ldt-Control2 button:first").button({
       
  1724 			icons: {
       
  1725 				primary: 'ui-icon-search'//,
       
  1726 				//secondary: 'ui-icon-volume-off'
       
  1727 			},
       
  1728 			text: false
       
  1729 		}).next().button({
       
  1730 			icons: {
       
  1731 				primary: 'ui-icon-volume-on'
       
  1732 			},
       
  1733 			 text: false
       
  1734 		});
       
  1735 
       
  1736 		// /!\ PB A MODIFIER 
       
  1737 		//__IriSP.MyTags.draw();
       
  1738 		IriSP.trace("__IriSP.createInterface","ICI2");
       
  1739 		IriSP.jQuery( "#ldt-CtrlPlay" ).attr( "style", "background-color:#CD21C24;" );
       
  1740 		
       
  1741 		IriSP.jQuery( "#Ldt-load-container" ).hide();
       
  1742 		
       
  1743 		if( IriSP.config.gui.mode=="radio" & IriSP.jQuery.browser.msie != true ) {
       
  1744 			IriSP.jQuery( "#Ldtplayer1" ).attr( "height", "0" );
       
  1745 		}
       
  1746 		IriSP.trace( "__IriSP.createInterface" , "3" );
       
  1747 
       
  1748 		IriSP.trace( "__IriSP.createInterface", "END" );
       
  1749 		
       
  1750 	};