diff -r cefce0845ac5 -r 8393d3473b98 front_idill/src/mosaic/js/mosaic.js --- a/front_idill/src/mosaic/js/mosaic.js Fri Jun 29 15:46:34 2012 +0200 +++ b/front_idill/src/mosaic/js/mosaic.js Fri Jun 29 16:16:24 2012 +0200 @@ -24,62 +24,183 @@ */ function mosaic(config, default_conf) { + //Interactions souris/kinect. + this.mouseInteractions = false; + //Interactions avec/sans préphase. + this.prephaseEnabled = true; + + this.gestures = ["fall", "jump", "circle", "screw", "bend", "arc", "pendulum", "knee-up", "right-angle", "wave", "slow", "hello", "no-motion", "wheel", "contact", "run"]; + //Chemin du fichier de configuration. this.config_path = config; //Configuration par défaut en cas de valeur erronnée. this.default_config = default_conf; - this.config = new Object(); + this.config = new Object(); //Tableaux des urls des vidéos, des snapshots et de leur position dans la mosaïque. this.videos = []; this.urls = []; + this.sources = []; this.imgs = []; + this.opacities = []; + this.timeToGoAt = []; this.ids = []; this.fillingIds = []; this.currentRandomVideoIdx = 0; - + + //Dernières positions des pointeurs. + this.mainPointerLastX; + this.mainPointerLastY; + this.secondPointerLastX; + this.secondPointerLastY; + //Dernières positions avant le lancement de la fonction d'idle. + this.mainPointerIdleStartX; + this.mainPointerIdleStartY; + this.secondPointerIdleStartX; + this.secondPointerIdleStartY; + //Dimensions de la mosaïque en pixels. this.width; - this.height; + this.height; //Dimensions d'un snapshot en pixels. this.snapshotWidth; - this.snapshotHeight; + this.snapshotHeight; //Espacement entre les snapshots en pixels. this.marginWidth; - + //Booléens permettant ou non certaines intéractions selon le contexte. this.zoomed; this.fullscreen; this.canMoveToNeighbour; + this.mainPointerExitBorder; + this.secondPointerExitBorder; + this.isMainPointerDisplayed; + this.isSecondPointerDisplayed; this.helpDisplayed; + //Indique si l'utilisateur a manuellement pausé la vidéo. + this.userPaused; + //Indique si on est en train de se déplacer vers un voisin. + this.currentlyMoving; + //Indique si on est en train de dézoomer vers la mosaïque. + this.currentlyUnzooming; + //Indique si on peut s'approcher de kinect. + this.canStart; + //Indique si on est actuellement sur un snapshot. + this.isOnASnapshot; + //Indique si l'idle des pointeurs est disponible (deux mains détectées). + this.pointersIdleAvailable; + //Indique si le timeout pour l'idle des pointeurs à besoin d'être lancé. + this.pointersIdleNeedLaunch; + //Indique si les deux mains sont là. + this.areBothPointersHere; + //Indique si le timeout pour la détection de deux pointeurs a été lancé. + this.areBothPointersTimeoutLaunched; + //Indique si la mosaïque a été filtrée. + this.isMosaicFiltered; + //Indique si on est actuellement dans une recherche par gesture. + this.isCurrentlyInASearchByGesture; + //Indique si un pointeur est déjà sur une notification de recherche par gesture. + this.alreadyOnNotification; + //Si on a fait un swipe. + this.isSwipe; + //On peut swiper. + this.canSwipe; + //On passe vers une autre video automatiquement à la fin d'une lecture. + this.autoMove; + //Si l'utilisateur a demandé à sélectionner la TL. + this.isTLRequested; + //Le pointeur gauche a sélectionné la TL. + this.isTLSelectedBySecondPointer; + //Le pointeur droit a sélectionné la TL. + this.isTLSelectedByMainPointer; + //On peut afficher l'aide. + this.canNotifyHelp; + //Indique si la mosaique est en train d'être filtrée. + this.isMosaicFiltering; + this.arrowLeftLoading = false; + this.arrowRightLoading = false; + this.arrowUpLoading = false; + this.arrowDownLoading = false; + //On est dans une recherche par courbes. + this.isSearchByCurvesOn; + this.canDrawNextCurve = false; + + //Timeout (attente) pour le zoom après un préZoom. + this.zoomTimeout; + //Timeout (attente) pour le passage vers un voisin. + this.moveToNeighbourTimeout; + this.mainPointerExitBorderTimeout; + this.secondPointerExitBorderTimeout; + //Idle time pour les pointeurs afin d'informer le front qu'on souhaite faire une recherche. + this.pointersSearchIdleTimeout; + //Vérifie toutes les N ms que les deux pointeurs sont détectés. + this.areBothPointersHereTimeout; + //Délai de suppression d'une notification de recherche par gesture. + this.removeNotificationByGestureTimeout; + //Délai de suppression d'une notification de recherche par gesture infructueuse. + this.removeFailedNotificationByGestureTimeout; + //Délai avant la suppression de notification swipe. + this.notifySwipeTimeout; + //Délai pour la sélection de la TL. + this.selectTLTimeout; + //Délai pour slider sur la TL. + this.canSlideInTLTimeout; + //Délai pour afficher l'aide. + this.canNotifyHelpTimeout; + this.arrowLeftTimeout; + this.arrowRightTimeout; + this.arrowUpTimeout; + this.arrowDownTimeout; + + this.arrowSpinnerTimeout; + this.nouserTimeout; + this.nextDrawCurveTimeout; + + //Dernier message INCOMING (pour éviter d'effectuer n fois la même action. + this.lastIncomingMessage; //Type de marqueur recherché dans la mosaïque (en mode filter). this.filterSearchedType = ""; - + //Mode actuel. - this.currentMode = "MOSAIC"; + this.currentMode = "NO-USER"; //Snapshot sur lequel on a zoomé. - this.previousZoomedSN; + this.previousZoomedSN = null; //Son ID. - this.previousId; + this.previousId; + //Dernier snapshot prézoomé non null. + this.lastNonNullSN = null; //Largeur de la marge pour le centrage vertical de la mosaïque. this.MPTop_margin; - this.top_margin; - + this.top_margin; + + //Gesture actuellement cherchée. + this.currentSearchGesture; + //Mosaïque locale. - this.localMos; + this.localMos; //Position des voisins lors d'un zoom. - this.neighboursIds = []; + this.neighboursIds = []; //ID du snapshot du milieu lors d'un zoom. this.centerId; + //Voisins sélectionnés par les pointeurs. + this.mainPointerNeighbourSelectedId = null; + this.secondPointerNeighbourSelectedId = null; + //Snapshots a afficher. this.snapshotsToShow = 1; //Lecteur. this.player; + //Si le lecteur est prêt. + this.playerIsReady; + //Annotations (pour les marqueurs los d'un filtrage). this.annotations = []; + //Client websocket pour recevoir les notifications du Middleware. + this.client; + //Coordonnées et dimensions d'un snapshot zoomé. this.snTop = 0; this.snLeft = 0; @@ -99,8 +220,8 @@ */ mosaic.prototype.createMosaic = function() { - console.log('CREATE'); - this.currentMode = "NO-USER"; + // console.log('CREATE'); + // this.currentMode = "NO-USER"; var initPanel = '
'; var mp = $('#mainPanel'); mp.append(initPanel); @@ -119,11 +240,36 @@ //S'il s'agit d'un rectangle. if(imgs % len == 0) { - this.previousZoomedSN = ''; - this.previousPrezoomDiv = ''; + this.previousZoomedSN = null; + this.previousPrezoomDiv = null; this.fullscreen = false; this.canMoveToNeighbour = false; + this.currentlyZooming = false; + this.currentlyUnzooming = false; this.helpDisplayed = false; + this.canStart = false; + this.isOnASnapshot = false; + this.isMosaicFiltered = false; + this.areBothPointersHere = false; + this.areBothPointersTimeoutLaunched = false; + this.isCurrentlyInASearchByGesture = false; + this.alreadyOnNotification = false; + this.playerIsReady = false; + this.currentSearchGesture = ''; + this.isMainPointerDisplayed = false; + this.isSecondPointerDisplayed = false; + this.isSwipe = false; + this.canSwipe = false; + this.autoMove = false; + this.isTLRequested = false; + this.isTLSelectedByMainPointer = false; + this.isTLSelectedBySecondPointer = false; + this.canNotifyHelp = false; + this.isMosaicFiltering = false; + this.isSearchByCurvesOn = false; + + this.lastIncomingMessage = 'INCOMING-0'; + var str = ''; if(this.imgs.length >= imgs) @@ -148,7 +294,7 @@ */ mosaic.prototype.loadMosaic = function() { - console.log('LOAD'); + // console.log('LOAD'); var createMosaic = this.createMosaic(); if(createMosaic == '') @@ -178,14 +324,15 @@ this.MPTop_margin = ($(document).height() - $('#mainPanel').height())/2; $('#mainPanel').css('margin-top', this.MPTop_margin).css('margin-bottom', this.MPTop_margin); - //On affiche les notifications. - this.notifySelectionSearchMosaicFull(); + //On fait coincider le background du body avec celui de la mosaïque. + $('body').css('background-position', '0px ' + this.MPTop_margin + 'px'); + console.log(this.MPTop_margin); - $('.snapshotDivs').mouseenter(function () + /*$('.snapshotDivs').mouseover(function () { //On effectue un prézoom dès qu'on va sur une image. _this.preZoom($(this)); - }); + });*/ this.addPointers(); @@ -208,18 +355,56 @@ for (var i = 0; i < nbFichiers; i++) { - console.log('url : ' + _this.urls[i]); - var source = sourceManager.remoteSource({url: _this.urls[i], serializer: IriSP.serializers.ldt}); - source.onLoad(function() + // console.log('url : ' + _this.urls[i]); + _this.sources[i] = sourceManager.remoteSource({url: _this.urls[i], serializer: IriSP.serializers.ldt}); + _this.sources[i].onLoad(function() { + var source = this; + // console.log(source); globalAnnotations.addElements(source.getAnnotations()); + // console.log(source.url + ' ' + source.getAnnotations().length); fichiersCharges++; if (fichiersCharges == nbFichiers) { // instructions à exécuter quand tout est chargé _this.annotations = globalAnnotations; - console.log('annotations loaded'); - _this.init(); + // console.log(_this.annotations.length + ' ' + nbFichiers); + console.log(_this.annotations.length + ' annotations loaded from ' + nbFichiers + ' files.'); + + //Si on gère les interactions à la souris. + if(_this.mouseInteractions) + { + $('body').mousemove(function(e){_this.refreshMainPointer(e.pageX, e.pageY, _this)}); + } + + // if(false) + // { + if(_this.prephaseEnabled) + { + _this.init(); + _this.showNImages(0); + _this.currentMode = "NO-USER"; + } + else + { + _this.showNImages(20); + _this.currentMode = "MOSAIC"; + } + // } + + // /!\ // + // _this.currentMode = "FILTER"; + // _this.showNImages(20); + //_this.isSearchByCurvesOn = true; + // _this.startSearch(); + // console.log('CANVAS READY'); + // /!\ // + + /*_this.currentSearchGesture = 'bend'; + _this.currentMode = 'FILTER'; + _this.searchFilter('bend');*/ + + _this.previousZoomedSN = $('#snapshotDiv-' + _this.fillingIds[0]); } }); } @@ -232,7 +417,7 @@ { var _this = this; - var supposedToBeInt = ['length', 'imagesToShow', 'totalImages', 'timePrezoom', 'timePreUnzoom', 'timeZoom', 'timeUnzoom', 'timeNeighbourGlowing', 'timeNeighbourUnglowing', 'timeMovingToNeighbour', 'timeSearchFade', 'timeNotifyFade', 'timeFilterFade', 'timeFilling', 'zoomedMargin']; + var supposedToBeInt = ['length', 'imagesToShow', 'totalImages', 'timePrezoom', 'timePreUnzoom', 'timeZoom', 'zoomTime', 'timeUnzoom', 'timeNeighbourGlowing', 'timeNeighbourUnglowing', 'timeMovingToNeighbour', 'timeSearchFade', 'timeNotifyFade', 'timeFilterFade', 'timeANFade', 'timeFilling', 'zoomedMargin', 'timeoutZoom', 'timeoutUnzoom', 'timeoutMoveToNeighbour', 'timeoutPointersIdle', 'timeoutAreBothPointersHere', 'timeoutRemoveNotificationByGesture', 'timeoutRemoveFailedNotificationByGesture', 'timeoutNotifySwipe', 'timeoutSelectTL', 'timeoutSlideTL', 'timeoutCanNotifyHelp', 'timeoutRemoveSpinner', 'timeoutNouser', 'timeoutNextDrawCurve']; var supposedToBeFloat = ['zoomPercentage', 'prezoomPercentage']; $.getJSON(file_path, function(data) @@ -246,7 +431,7 @@ var intVal = parseInt(val); if(isNaN(intVal)) { - console.log(_this.default_config); + // console.log(_this.default_config); _this.config[key] = _this.default_config[key]; console.log("param[" + key + "] : Valeur " + val + " incorrecte (non Int). Valeur par défaut " + _this.default_config[key] + " chargée à la place."); } @@ -294,14 +479,17 @@ if(_this.config['local'] == 'true') { - console.log("Loading local metadata."); + // console.log("Loading local metadata."); _this.loadFromJson('./player/json/local_videos.json'); } else { - console.log("Loading online metadata."); + // console.log("Loading online metadata."); _this.loadFromJson('./player/json/online_videos.json'); } + + //On initialise le client. + _this.client = new client(_this.config['host'], _this.config['port'], _this); }); } @@ -313,19 +501,22 @@ mosaic.prototype.init = function() { var _this = this; - + if(this.currentRandomVideoIdx > this.config['imagesToShow']) { this.currentRandomVideoIdx = 0; } + this.previousZoomedSN = $('#snapshotDiv-' + this.fillingIds[this.currentRandomVideoIdx]); this.previousId = $('img', this.previousZoomedSN).attr('id'); - console.log('ids', this.fillingIds[this.currentRandomVideoIdx]); + // console.log('CURRENT MODE : ' + _this.currentMode); + // console.log('ids', this.fillingIds[this.currentRandomVideoIdx]); this.previousZoomedSN.fadeTo(this.config['timePrezoom'], 1, function() { + // console.log('CURRENT MODE : ' + _this.currentMode); _this.zoom(); _this.currentRandomVideoIdx++; }); @@ -336,38 +527,68 @@ */ mosaic.prototype.showNImages = function(n) { - if(n > 1) + if(this.currentlyMoving) + { + return; + } + + // console.log('INCOMING ----- ' + n); + //Si il y a plus d'un snapshot à afficher, on entre dans le mode INCOMING avec en paramètre le nombre à afficher. + if(n > 1 && n < this.config['imagesToShow']) { this.currentMode = "INCOMING-" + n; this.unzoom(); + this.currentSearchGesture = ''; + $('.notifications').remove(); + this.isMosaicFiltered = false; + this.isCurrentlyInASearchByGesture = false; + $('#mainPointer').fadeTo(this.config['timePrezoom'], 0); + $('#secondPointer').fadeTo(this.config['timePrezoom'], 0); + $('#spinner').remove(); + this.deselectAllNeighbours(); + $('.prezoomContainers').remove(); + } + // console.log('n : ' + n); + if(n >= this.config['imagesToShow']) + { + // this.unzoom(); + if(this.currentMode == "NO-USER" || this.currentMode.indexOf("INCOMING-") > -1) + { + this.currentMode = "INCOMING-20"; + this.unzoom(); + this.currentMode = "MOSAIC"; + $('.notifications').remove(); + this.mosaicSelectionAndSearch(); + clearTimeout(this.nouserTimeout); + console.log('OK'); + } + //On affiche les notifications. + // this.notifySelectionSearchMosaicFull(); + + // $('#mainPointer').fadeTo(this.config['timePrezoom'], 1); + // $('#secondPointer').fadeTo(this.config['timePrezoom'], 1); } + //Pour les snapshots à afficher. for(var i = 0 ; i < n ; i++) { - if($('#snapshotDiv-' + i).css('opacity') < 1) + //Si les snapshots ne sont pas affichés. + if($('#snapshotDiv-' + this.fillingIds[i]).css('opacity') < 1) { - $('#snapshotDiv-' + i).fadeTo(this.config['timeFilling'], 1); + //On les fait apparaître. + $('#snapshotDiv-' + this.fillingIds[i]).fadeTo(this.config['timeFilling'], '1'); } } -} - -/* - * Affiche les pointeurs. -*/ -mosaic.prototype.addPointers = function() -{ - var _this = this; - - var mainPointer = '
'; - $('body').append(mainPointer); - $('body').mousemove(function(evt) + //Pour ceux à masquer. + for(var i = n ; i < this.config['imagesToShow'] ; i++) { - $('#mainPointer').css( + //Si les snapshots ne sont pas masqués et qu'il ne s'agit pas du dernier snapshot en lecture aléatoire (mode NO-USER). + if($('#snapshotDiv-' + this.fillingIds[i]).css('opacity') > 0 && this.fillingIds[i] != this.currentRandomVideoIdx) { - top: evt.pageY - $('#mainPointer').height()/2, - left: evt.pageX - $('#mainPointer').width()/2 - }); - }); + //On les masque. + $('#snapshotDiv-' + this.fillingIds[i]).fadeTo(this.config['timeFilling'], '0'); + } + } } /* @@ -375,9 +596,20 @@ */ mosaic.prototype.manageControlEvents = function(event) { - console.log('manage'); + // console.log('manage'); + + var _this = this; + + if(typeof event === 'undefined') + { + return; + } + + var gestureReceived = ''; + //Sinon si on a appuyé sur 'g' ou 'G'. - if(event.which == 103 || event.which == 71) + // if(event.which == 103 || event.which == 71) + /*if(event == "CURVES") { //Si on est déjà en recherche par courbes. if(this.currentMode == "SEARCH" || this.currentMode == "FILTER") @@ -415,7 +647,8 @@ } } //Si c'est a ou A. - else if(event.which == 65 || event.which == 97) + // else if(event.which == 65 || event.which == 97) + else if(event == "HELP") { if(!this.helpDisplayed) { @@ -427,307 +660,218 @@ } } //Si c'est v ou V. - else if(event.which == 86 || event.which == 118) + // else if(event.which == 86 || event.which == 118) + else if(event == "NOTIFY-SEARCH") { this.notifySearchMarkers('run;jump;fall'); } //Si c'est b ou B. - else if(event.which == 66 || event.which == 98) + // else if(event.which == 66 || event.which == 98) + else if(event == "REMOVE-SEARCH") { this.removeSearchMarkers(); } //Si c'est k ou K. - else if(event.which == 75 || event.which == 107) + // else if(event.which == 75 || event.which == 107) + else if(event == "FILTER") { this.searchFilter('circle'); } //Si c'est l ou L. - else if(event.which == 76 || event.which == 108) + // else if(event.which == 76 || event.which == 108) + else if(event == "REMOVE-FILTER") { this.removeFilter(); } //Si on a appuié sur la touche 'q' ou 'Q'; - else if(event.which == 113 || event.which == 81) + // else if(event.which == 113 || event.which == 81) + else if(event == "UNZOOM") { this.unzoom(); - } - else if(event.which == 111 || event.which == 79) + }*/ + // else if(event.which == 111 || event.which == 79) + if(event.indexOf("INCOMING-") != -1 && this.prephaseEnabled) { - if(this.snapshotsToShow > this.imagesToShow) + // console.log(this.date() + ' ' + event); + // console.log('CAN START : ' + this.canStart); + if(this.canStart) { - this.snapshotsToShow = this.imagesToShow; - } - else - { - this.snapshotsToShow += 5; + if(this.snapshotsToShow > this.config['imagesToShow']) + { + this.snapshotsToShow = this.config['imagesToShow']; + } + else + { + var params = event.split('-'); + // console.log(event); + this.snapshotsToShow = params[1]; + } + + //Si la position de l'utilisateur a changé. + if(event != this.lastIncomingMessage) + { + console.log(this.snapshotsToShow); + this.lastIncomingMessage = event; + this.showNImages(this.snapshotsToShow); + } } - this.showNImages(this.snapshotsToShow); + clearTimeout(this.nouserTimeout); + this.nouserTimeout = setTimeout(function() + { + /*_this.showNImages(0); + _this.init(); + _this.canStart = false; + _this.currentMode = "NO-USER";*/ + + window.location.reload(); + // mos = new mosaic('./config.json', default_parameters); + + console.log('NOUSER'); + }, this.config['timeoutNouser']); } -} - -/* - * Zoom sur la position d'une image, 1ère partie. Durant le laps de temps de time ms, l'utilisateur a le choix de zoomer sur une autre image. - * Après ce laps de temps, l'image zoom complétement et il n'est plus possible de sélectionner une autre image par pointage. - */ -mosaic.prototype.preZoom = function(snapshot) -{ - if(this.fullscreen) + else if((event == "NO-USER" || event == "INCOMING-0" || event == "INCOMING-1") && this.prephaseEnabled) { - return; + /*this.showNImages(0); + this.init(); + this.canStart = false; + this.currentMode = "NO-USER";*/ + + window.location.reload(); + // mos = new mosaic('./config.json', default_parameters); + + console.log('NOUSER'); + + /*this.currentMode = "NO-USER"; + this.showNImages(0); + this.canStart = false; + this.init();*/ } - - //On enlève les notifications initiales si elles existent. - this.removeSelectionSearchMosaicFull(); - - //Mosaïque. - var _this = this; - //Dimensions de la mosaïque. - var h = this.height, w = this.width; - //Longueur en images, nombre d'images et taille de bordure de la mosaïque. - var len = this.config['length'], imgs = this.config['imagesToShow'], margin = this.marginWidth; - //Dimensions et position d'un snapshot dans la mosaïque. - var snHeight = this.snapshotHeight, snWidth = this.snapshotWidth; - var sTop = snapshot.position().top, sLeft = snapshot.position().left; - var prezoomPercentage = this.config['prezoomPercentage']; - - //ID de l'image actuelle. - var currentId = $('img', snapshot).attr('id'); - - //Si un zoom est déjà en cours, on ne zoom sur rien d'autre en attendant que ce snapshot ai dézoomé en cas de mouseleave. - if(this.zoomed) + // /!\/!\ // + else if(event.indexOf("SWIPE") != -1) { - if($('#preZoomContainer-' + currentId) != $(this) && this.previousZoomedSN != '' && this.previousId != '') + if(this.player && this.player.widgets && this.playerIsReady && !this.isSwipe) { - this.preUnzoom(); - } - else - { - return; + this.isSwipe = true; + + if(this.currentMode == 'SEARCH' && this.isMosaicFiltered && !this.player.widgets[0].isAMarkerAhead(this.currentSearchGesture)) + { + this.playNextVideo(); + } + + //L'utilisateur a fait un swipe left. + if(event.indexOf("LEFT") != -1) + { + this.player.widgets[0].switchToMarker(true, this.currentSearchGesture); + if(this.currentMode == 'VIDEO') + { + $('.notifications').remove(); + this.videoSwipe('left'); + } + else if(this.currentMode == 'SEARCH' && !this.currentSearchGesture) + { + $('.notifications').remove(); + this.searchSearchAndSwipe('left'); + } + else if(this.currentMode == 'SEARCH' && this.currentSearchGesture) + { + $('.notifications').remove(); + this.searchGestureAndSwipe(this.currentSearchGesture, 'valid', 'left'); + } + } + //L'utilisateur a fait un swipe right. + else if(event.indexOf("RIGHT") != -1) + { + this.player.widgets[0].switchToMarker(false, this.currentSearchGesture); + if(this.currentMode == 'VIDEO') + { + $('.notifications').remove(); + this.videoSwipe('right'); + } + else if(this.currentMode == 'SEARCH' && !this.currentSearchGesture) + { + $('.notifications').remove(); + this.searchSearchAndSwipe('right'); + } + else if(this.currentMode == 'SEARCH' && this.currentSearchGesture) + { + $('.notifications').remove(); + this.searchGestureAndSwipe(this.currentSearchGesture, 'valid', 'right'); + } + } + + //On le fait disparaitre au bout d'un certain temps. + this.notifySwipeTimeout = setTimeout(function() + { + _this.isSwipe = false; + + // /!\ // + $('.notifications').remove(); + + if(_this.currentMode == 'SEARCH' && !_this.currentSearchGesture) + { + _this.searchSearch(); + } + else if(_this.currentMode == 'SEARCH' && _this.currentSearchGesture) + { + _this.searchGesture(_this.currentSearchGesture, 'valid'); + } + + }, this.config['timeoutNotifySwipe']); } } - - //On indique qu'on a zoomé et on spécifie le snapshot sur lequel on a zoomé. - this.zoomed = true; - this.previousZoomedSN = snapshot; - this.previousId = currentId; - - //On récupère les attributs de l'image. - var fakeImg = $('img', snapshot); - //On forme la balise de la fausse image et on passe son url pour les grands snapshots. - fakeImg = ''; - //On génère un faux snapshot identique au précédent et qu'on va coller dessus. - var fakeSnapshot = '
' + fakeImg + '
'; - - //On l'ajoute à la mosaïque. - $('#mainPanel').append(fakeSnapshot); - //On modifie ses attributs. - $('#fake-' + currentId).load(function() - { - $('#prezoomContainer-' + currentId).css('display', 'block'); - $('#prezoomContainer-' + currentId).css('top', sTop).css('left', sLeft).css('width', (snWidth + margin)).css('height', (snHeight + margin)); - $('#prezoomSnapshot-' + currentId).css('width', (snWidth)).css('height', (snHeight)); - - //Dimensions et coordonnées initiales du div sur lequel on zoom. - var initialDivWidth = $('#prezoomContainer-' + currentId).width(), initialDivHeight = $('#prezoomContainer-' + currentId).height(); - var initialDivTop = $('#prezoomContainer-' + currentId).position().top, initialDivLeft = $('#prezoomContainer-' + currentId).position().left; - //Dimensions et coordonnées finales du div. - var finalDivWidth = initialDivWidth * (prezoomPercentage+1), diffWidth = finalDivWidth - initialDivWidth, finalDivHeight = initialDivHeight + diffWidth; - var finalDivTop = (initialDivTop - (finalDivHeight - snHeight)/2), finalDivLeft = (initialDivLeft - (finalDivWidth - snWidth)/2); - - //CAS PARTICULIER pour la position du snapshot zoomé : les bordures. - if(finalDivTop < 0) + else if(event.indexOf("BEND") != -1 || event.indexOf('KNEE-UP') != -1 || event.indexOf('FALL') != -1 || event.indexOf('JUMP') != -1) + { + gestureReceived = event.toLowerCase(); + gestureReceived = gestureReceived.replace('wave', 'hello'); + this.currentSearchGesture = gestureReceived; + } + else if(event.indexOf("HELLO") != -1 && this.canNotifyHelp && !this.areBothPointersHere) + { + if(this.currentMode == 'SEARCH') { - finalDivTop = -margin; - } - if(finalDivTop + finalDivHeight > h) - { - finalDivTop = h - finalDivHeight; - } - if(finalDivLeft < 0) - { - finalDivLeft = 0; - } - if(finalDivLeft + finalDivWidth + margin*2 > w) - { - finalDivLeft = w - finalDivWidth - margin*2; + this.notifyHelp(false); } - - ////Code de debug. - ////CAUTION//// - /*var red = '
'; - if($('#red') != null || $('#red') != undefined) - $('body').append(red); - $('#red').css('background-color', '#FF0000').css('position', 'absolute').css('top', '0px').css('left', '0px').css('width', '100px').css('height', '100px'); - $('#red').css('top', finalDivTop).css('left', finalDivLeft).css('width', finalDivWidth).css('height', finalDivHeight);*/ - //alert("initial : " + initialDivWidth + " " + initialDivHeight + " ; final : " + finalDivWidth + " " + finalDivHeight); - ////CAUTION//// - - //On prézoom le div en le centrant sur le milieu du snapshot pointé. - $('#prezoomSnapshot-' + currentId).animate( - { - width: finalDivWidth + margin, - height: finalDivHeight - margin*2, - top: finalDivTop + margin, - left: finalDivLeft + margin - }, _this.config['timePrezoom']); - $('#prezoomContainer-' + currentId).animate( - { - width: finalDivWidth + margin*2, - height: finalDivHeight - margin, - top: finalDivTop + margin, - left: finalDivLeft - }, _this.config['timePrezoom'], function() + else if(this.currentMode == 'FILTER') { - _this.notifyPointMosaicPrezoom(); - }); - }); - - //Si on clique sur le snapshot prézoomé, on enclenche un zoom total sur ce snapshot. - $('#prezoomContainer-' + currentId).click(function () - { - if(this.previousZoomedSN != '') - { - _this.zoom(); + this.notifyHelp(true); } - }); -} - -/* - * Dézoome sur la position de l'image. Il est à noter que ce dézoome diffère du dézoom global dans la mesure où celui-ci ne concerne que l'image sur laquelle on a zoomé. - */ -mosaic.prototype.preUnzoom = function() -{ - //Si on n'a pas zoomé, on quitte la fonction. - if(!this.zoomed) - { - return; } - this.removePointMosaicPrezoom(); - - //On spécifie la marge afin de centrer le prédézoom. - var margin = this.marginWidth; - //ID du snapshot précédemment pointé. - var id = this.previousId; - //On ne zoom plus. - this.zoomed = false; - //On rétrécit le snapshot de prézoom, puis on le supprime en donnant l'illusion qu'il s'agissait du véritable snapshot, alors qu'en fait c'était un clone. - $('#prezoomSnapshot-' + id).animate( - { - width: this.snapshotWidth, - height: this.snapshotHeight, - top: this.previousZoomedSN.position().top, - left: this.previousZoomedSN.position().left - }, this.config['preUnzoomTime']); - $('#prezoomContainer-' + id).animate( - { - width: this.snapshotWidth + margin, - height: this.snapshotHeight + margin, - top: this.previousZoomedSN.position().top, - left: this.previousZoomedSN.position().left - }, this.config['preUnzoomTime'], function(){ $(this).remove(); this.zoomed = false; }); -} - - -/* - * Zoom d'un snapshot en plein écran. - */ -mosaic.prototype.zoom = function() -{ - var _this = this; - - //Si la mosaïque est en pleine écran, pas la peine de zoomer. - if(this.currentMode == "VIDEO" || this.currentMode == "SEARCH") + if(gestureReceived != '') { - return; - } - - this.removePointMosaicPrezoom(); - - //On prend les attributs nécessaires au calculs. - var margin = this.marginWidth, len = this.config['length'], imgs = this.config['imagesToShow'], zoomedMargin = this.config['zoomedMargin']; - var zoomPercentage = this.config['zoomPercentage']; - var initMPWidth = this.previousZoomedSN.width() * len + margin*len, initMPHeight = this.previousZoomedSN.height() * (imgs / len) + margin*(imgs / len); - var newMPWidth = initMPWidth * len + zoomedMargin * (len), newMPHeight = initMPHeight * (imgs / len) + zoomedMargin * ((imgs / len)); - var newPreMPWidth = initMPWidth * len * zoomPercentage + zoomedMargin * (len), newPreMPHeight = initMPHeight * (imgs / len) * zoomPercentage + zoomedMargin * ((imgs / len)); - - //Dimensions et coordonnées initiales du div sur lequel on zoom. - var initialDivWidth = this.previousZoomedSN.width(), initialDivHeight = this.previousZoomedSN.height(); - var initialDivTop = this.previousZoomedSN.position().top, initialDivLeft = this.previousZoomedSN.position().left; - //Dimensions et coordonnées finales du div. - var finalDivWidth = initialDivWidth * (zoomPercentage+1), finalDivHeight = initialDivHeight * (zoomPercentage+1); - var newZoomTop = -this.previousZoomedSN.position().top*(newPreMPHeight/initMPHeight) - zoomedMargin/2 + (initMPHeight - initMPHeight * zoomPercentage)/2, newZoomLeft = -this.previousZoomedSN.position().left*(newPreMPWidth/initMPWidth) - zoomedMargin/2 + (initMPWidth - initMPWidth * zoomPercentage)/2; - var newSnWidth = initMPWidth * zoomPercentage, newSnHeight = initMPHeight * zoomPercentage; - - this.preUnzoom(this); - /*SINGULARITE*/ - this.fullscreen = true; - - //On passe l'image du snapshot pointé en HD. - var zoomedImg = $('img', this.previousZoomedSN); - var src = zoomedImg.attr('src'); - zoomedImg.attr('src', src.replace('-little/', '/')); - - //On récupère son ID. - var tab, zoomedImgId; - tab = _this.previousId.split('-'); - zoomedImgId = tab[1]; - - //On donne les dimensions des snapshots. - $('.snapshotDivs').animate( - { - width: newSnWidth, - height: newSnHeight, - margin: zoomedMargin/2 + 'px', - }, this.config['zoomTime']); - - if(this.currentMode != 'NO-USER') - { - //Les snapshots baissent alors en opacité, donnant l'impression qu'ils sont grisés. - $('.snapshotDivs').animate( + if(this.currentMode == "SEARCH" && this.playerIsReady) { - opacity: '0.4' - }, this.config['zoomTime']); - //Le snapshot du milieu revient à une opacité optimale, ce qui attire l'attention de l'utilisateur. - $(this.previousZoomedSN).animate( + this.player.widgets[0].searchByGesture(gestureReceived); + this.isCurrentlyInASearchByGesture = this.player.widgets[0].isCurrentlyInASearchByGesture; + + $('.notifications').remove(); + this.searchGesture(gestureReceived, 'valid'); + } + else if(this.currentMode == "FILTER") { - opacity: '1' - }, this.config['zoomTime']); - } - - //On zoome sur la mosaïque. - $('#mainPanel').animate( - { - width: newPreMPWidth, - height: newPreMPHeight, - top: newZoomTop, - left: newZoomLeft - }, this.config['zoomTime'], function() - { - //On charge les interactions avec les voisins. - _this.centerId = zoomedImgId; - - if(_this.currentMode != "NO-USER") - { - _this.currentMode = 'VIDEO'; - _this.listenToNeighbours(); + if(this.isMosaicFiltered) + { + // console.log('FILTER !!!'); + // this.notifySearch1Gesture(gestureReceived, 'valid'); + $('.notifications').remove(); + this.filterGesture(gestureReceived, 'valid'); + this.searchFilter(gestureReceived); + } } - _this.snTop = (zoomedImg.position().top + newZoomTop + _this.MPTop_margin), _this.snLeft = (zoomedImg.position().left + newZoomLeft); - _this.snWidth = newSnWidth + 1, _this.snHeight = newSnHeight + 1; - - _this.notifyTopVideo = newZoomTop; - _this.notifyLeftVideo = newZoomLeft; - - _this.loadPlayer(_this.snTop, _this.snLeft, _this.snWidth, _this.snHeight, newZoomTop, newZoomLeft); - }); + if(this.helpDisplayed) + { + this.removeHelp(); + } + } + // /!\/!\ // } /* * Chargement du player basé sur le metadataplayer. */ -mosaic.prototype.loadPlayer = function(newZoomTop, newZoomLeft, newSnWidth, newSnHeight, zoomTop, zoomLeft) +mosaic.prototype.loadPlayer = function(newZoomTop, newZoomLeft, newSnWidth, newSnHeight, zoomTop, zoomLeft, timeToGo) { var _this = this; @@ -782,376 +926,112 @@ //On démarre le player. this.player = null; + this.player = new IriSP.Metadataplayer(_config, _metadata); - if(this.currentMode == 'NO-USER') - { - this.player.onLoad(function() - { - console.log(_this.player); - console.log(_this.player.popcorn); - //Lorsque le player est en pause (par exemple lorsque le curseur arrive à la fin de la timeline). - if(_this.player.popcorn != undefined) - { - _this.player.popcorn.listen('pause', function() - { - _this.unzoom(); - }); - } - }); - } -} - -/* - * Retour à la taille normale de la mosaïque. - */ -mosaic.prototype.unzoom = function() -{ - //Si on n'est pas en plein écran, on quitte. - console.log("'" + this.currentMode + "'"); - if(this.currentMode != "SEARCH" && this.currentMode != "VIDEO" && this.currentMode != "NO-USER" && this.currentMode.indexOf("INCOMING") == -1) + this.player.onLoad(function() { - return; - } - - this.snTop = 0; - this.snLeft = 0; - this.Width = 0; - this.snHeight = 0; - - //On charge les attributs nécessaires aux calculs. - var sWidth = this.snapshotWidth, sHeight = this.snapshotHeight; - var mpWidth = this.width, mpHeight = this.height; - var _this = this; - - //On passe le snapshot sur lequel on a zoomé en SD. - var zoomedImg = $('img', this.previousZoomedSN); - var src = zoomedImg.attr('src'); - zoomedImg.attr('src', src.replace('snapshots/', 'snapshots-little/')); - - _this.player.widgets[0].freePlayer(); - $('.LdtPlayer').remove(); - $('body').append('
'); - _this.reaffectKeyPress(); - - //On rend leur opacité aux snapshots. Qui ne sont alors plus grisés. - $('.snapshotDivs').animate( - { - width: sWidth, - height: sHeight, - margin: this.marginWidth/2 + 'px' - }, this.config['unzoomTime']); - - if(this.currentMode != 'NO-USER') - { - if(this.currentMode.indexOf("INCOMING") == -1) + if(_this.currentMode == 'NO-USER') { - $('.snapshotDivs').animate( - { - opacity: '1' - }, this.config['unzoomTime']); + //On peut s'approcher de la kinect. + _this.canStart = true; + console.log('CAN START !'); + // console.log(_this.player); + // console.log(_this.player.popcorn); } - } - else - { - console.log('init'); - this.previousZoomedSN.fadeTo(this.config['unzoomTime'], 0, function() + //Lorsque le player est en pause (par exemple lorsque le curseur arrive à la fin de la timeline). + if(_this.player.popcorn) { - _this.init(); - }); - } - - //On dézoom sur la mosaïque. - $('#mainPanel').animate( - { - width: mpWidth, - height: mpHeight, - top: '0px', - left: '0px' - }, this.config['unzoomTime'], function() - { - //On n'est plus en plein écran, et on ne peut plus se déplacer vers le prochain voisin. - _this.fullscreen = false; - _this.canMoveToNeighbour = false; - - if(_this.currentMode != 'NO-USER') - { - //On revient en mode MOSAIC. - _this.currentMode = 'MOSAIC'; - //On ne permet plus le déplacement vers les voisins. - $('.snapshotDivs').unbind('mouseover', function() + _this.player.popcorn.listen('pause', function() { - _this.selectNeighbour(); + //Si l'utilisateur a mis en pause. + if(_this.userPaused) + { + + } + //Si la pause est naturelle (fin de la timeline, dézoom, déplacement vers un voisin). + else + { + //Si c'est en mode sans utilisateur. + if(_this.currentMode == 'NO-USER') + { + //On dézoome. + _this.unzoom(); + } + //Sinon. + else + { + //Si ce n'est pas causé par un déplacement ou un dézoom. + if(!_this.currentlyMoving && !_this.currentlyUnzooming) + { + //On réinitialise la position du curseur à la prochaine lecture de la vidéo. + console.log('REINIT'); + //On passe a la video suivante. + console.log('AUTOMOVE'); + + //Si on est en mode timeline et qu'on est en pause, c'est probablement que l'user a placé le curseur à la fin. + if(_this.currentMode != 'TIMELINE') + { + _this.playNextVideo(); + } + //_this.timeToGoAt[parseInt(_this.centerId)] = 0; + console.log('time to go at to 0'); + // return; + } + } + } }); - //On remet les notifications initiales. - _this.notifySelectionSearchMosaicFull(); + // console.log('mosaic filtered : ' + _this.isMosaicFiltered); + + _this.player.popcorn.on("markersready", function() + { + _this.playerIsReady = true; + + if(_this.currentMode == 'VIDEO' || _this.currentMode == 'SEARCH' || _this.currentMode == 'TIMELINE') + { + _this.canSwipe = true; + } + + console.log('TIME TO GO AT : ' + _this.timeToGoAt[_this.centerId], _this.centerId, _this.imgs[_this.centerId]); + + if(_this.isMosaicFiltered) + { + if(_this.currentSearchGesture == '') + { + _this.removeFilter(); + } + else + { + _this.currentMode = 'SEARCH'; + // console.log(_this.currentSearchGesture); + _this.player.widgets[0].searchByGesture(_this.currentSearchGesture); + _this.isCurrentlyInASearchByGesture = _this.player.widgets[0].isCurrentlyInASearchByGesture; + + if(_this.timeToGoAt[_this.centerId] === 0 && _this.player.widgets[0].atLeastOneSearchMarker(_this.currentSearchGesture)) + { + _this.player.widgets[0].goToFirstSearchedMarker(_this.currentSearchGesture); + } + else + { + _this.player.popcorn.currentTime(_this.timeToGoAt[_this.centerId]); + } + } + } + // /!\ // + else + { + if(_this.player.popcorn) + { + _this.player.popcorn.currentTime(_this.timeToGoAt[_this.centerId]); + } + } + }); } - }); -} - -/* - * Affecte les listeners mouseenter aux voisins lors d'une vue en plein écran. - */ -mosaic.prototype.listenToNeighbours = function() -{ - ////TEST - //$('.test').empty(); - var _this = this; - - this.canMoveToNeighbour = false; - var currentLine = Math.floor(this.centerId / this.config['length']), currentColumn = this.centerId % this.config['length']; - var zoomedImg = $('img', this.previousZoomedSN); - - //On cherche l'ID des voisins. - //Si le voisin de gauche est sur la même ligne, on n'est pas sur la bordure de gauche. - this.neighboursIds[0] = (currentColumn > 0) ? (this.centerId - 1) : -1; - //Si le voisin de droite est sur la même ligne, on n'est pas sur la bordure de droite. - this.neighboursIds[1] = (currentColumn < this.config['length']) ? (+this.centerId + 1) : -1; - //Si le voisin du haut est sur la même colonne, on n'est pas sur la bordure du haut. - this.neighboursIds[2] = (currentLine > 0) ? (this.centerId - this.config['length']) : -1; - //Si le voisin du bas est sur la même colonne, on n'est pas sur la bordure du bas. - this.neighboursIds[3] = (currentLine < (this.config['imagesToShow'] / this.config['length'])) ? (+this.centerId + this.config['length']) : -1; - - //ID du cadre voisin. - var preId; - - for(var i = 0 ; i < this.neighboursIds.length ; i++) - { - if(this.neighboursIds[i] != -1) - { - preId = '#neighbourFrameBorder-' + this.neighboursIds[i]; - //On permet le déplacement vers les voisins. - // $('#snapshotDiv-' + this.neighboursIds[i] + ', ' + preId + '-left,' + preId + '-right,' + preId + '-up,' + preId + '-down').mouseenter(mos.selectNeighbour); - - $('#snapshotDiv-' + this.neighboursIds[i]).mouseover(function() - { - _this.selectNeighbour($(this)); - }); - } - } + }); } /* - * Change la coloration d'une bordure où on se positionne lors d'une vue en plein écran. - */ -mosaic.prototype.selectNeighbour = function(neighbour) -{ - ////TEST - //$('.test').append(mos.currentMode + " " + $(this).attr('id') + " " + 'snapshotDiv-' + mos.centerId + ','); - var _this = this; - - //Si on est en mode VIDEO (plein écran) ET si le snapshot pointé est un voisin. - - if((this.currentMode == 'VIDEO') && (neighbour.attr('id') != 'snapshotDiv-' + this.centerId)) - { - //On crée le cadre qui va être superposé au voisin. - //On le colle au voisin. - var tab = neighbour.attr('id').split('-'); - var snapshotId = tab[1]; - var neighbourFrame = ''; - var marginValue = parseFloat(neighbour.css('margin')); - - neighbourFrame += '
'; - - $('#mainPanel').append(neighbourFrame); - - //On positionne le div de background juste au niveau du voisin. - $('#neighbourFrame-' + snapshotId).css( - { - 'top': (+neighbour.position().top + marginValue), - 'left': (+neighbour.position().left + marginValue), - 'width': neighbour.width(), - 'height': neighbour.height() - }); - //On positionne le div de background noir juste au niveau de l'image du voisin. - $('#neighbourImgBg-' + snapshotId).css( - { - 'top': marginValue, - 'left': marginValue, - 'width': neighbour.width() - marginValue*2, - 'height': neighbour.height() - marginValue*2, - }); - //On met par dessus le div de l'image clonée du voisin. - $('#neighbourImg-' + snapshotId).css( - { - 'top': 0, - 'left': 0, - 'width': neighbour.width() - marginValue*2, - 'height': neighbour.height() - marginValue*2, - 'background-image': 'url("' + $('img', neighbour).attr('src') + '")', - 'background-size': neighbour.width() + 'px ' + neighbour.height() + 'px', - 'background-position': -marginValue + 'px ' + -marginValue + 'px', - 'opacity': '0.4' - }); - - var fId = '#neighbourFrame-' + snapshotId; - - $(fId).animate( - { - //On le fait apparaître. - opacity: '1' - }, _this.config['timeNeighbourGlowing'], function() - { - //On peut désormais se déplacer vers ce voisin. - _this.canMoveToNeighbour = true; - }); - //Lorsqu'on quitte un des snapshots (bien entendu le voisin en question), on retire le cadre. - //Si on clique sur le voisin ou son cadre, on passe au voisin suivant. - $(fId).mouseout(function() - { - _this.deselectNeighbour($(this)) - }).click(function() - { - _this.moveToNeighbour($(this)) - }); - } -} - -/* - * Change la coloration d'une bordure quittée lors d'une vue en plein écran. - */ -mosaic.prototype.deselectNeighbour = function(neighbour) -{ - ////TEST - //$('.test').append('un,'); - - //On ne peut plus se déplacer vers les voisins. - this.canMoveToNeighbour = false; - - //On récupère le voisin. - var neighbourFrame = neighbour; - - //Si on est en mode VIDEO. - if(this.currentMode == 'VIDEO') - { - //On le fait disparaître progressivement. - neighbourFrame.animate( - { - opacity: '0' - }, this.config['timeNeighbourUnglowing'], function() - { - //Une fois invisible, on le supprime. - neighbourFrame.remove(); - }); - } -} - -/* - * Lors d'une vue en plein écran, on se déplace vers le voisin dont l'id a été spécifié dans la fonction appelante. - */ -mosaic.prototype.moveToNeighbour = function(neighbour) -{ - var _this = this; - //Si on ne peut pas se déplacer vers les voisins, on quitte. - if(!_this.canMoveToNeighbour) - { - return; - } - - //On obtient l'ID de destination. - var tab = neighbour.attr('id').split('-'); - var destinationId = tab[1]; - - //On charge les attributs nécessaires aux calculs. - var length = _this.config['length']; - var MPCurrentTop = $('#mainPanel').position().top, MPCurrentLeft = $('#mainPanel').position().left; - var divideCoeffTop = Math.floor(destinationId / length) == 0 ? 1 : Math.floor(destinationId / length); - var divideCoeffLeft = destinationId % length == 0 ? 1 : destinationId % length; - var neighbourFrameTop = $('#snapshotDiv-' + destinationId).position().top, neighbourFrameLeft = $('#snapshotDiv-' + destinationId).position().left; - - //On définit pour le déplacement vertical s'il est nécessaire de se déplacer en haut ou en bas. - if(_this.previousZoomedSN.position().top > neighbourFrameTop) - MPCurrentTop += Math.abs(neighbourFrameTop - _this.previousZoomedSN.position().top); - else if(_this.previousZoomedSN.position().top < neighbourFrameTop) - MPCurrentTop -= Math.abs(neighbourFrameTop - _this.previousZoomedSN.position().top); - //On définit pour le déplacement horizontal s'il est nécessaire de se déplacer à gauche ou à droite. - if(_this.previousZoomedSN.position().left > neighbourFrameLeft) - MPCurrentLeft += Math.abs(neighbourFrameLeft - _this.previousZoomedSN.position().left); - else if(_this.previousZoomedSN.position().left < neighbourFrameLeft) - MPCurrentLeft -= Math.abs(neighbourFrameLeft - _this.previousZoomedSN.position().left); - - //On passe le snapshot de destination en HD. - var destinationImg = $('#snapshot-' + destinationId); - var destinationImgSrc = destinationImg.attr('src'); - destinationImg.attr('src', destinationImgSrc.replace('snapshots-little/', 'snapshots/')); - - //On passe l'ancien snapshot en SD. - var currentImgSrc = $('img', _this.previousZoomedSN).attr('src'); - $('img', _this.previousZoomedSN).attr('src', currentImgSrc.replace('snapshots/', 'snapshots-little/')); - - //On obtient l'ID du div de coloration du snapshot vers lequel on se déplace afin de le supprimer. - var neighbourFrame = neighbour; - var tab = neighbourFrame.attr('id').split('-'); - _this.centerId = tab[1]; - $(this).css('opacity', '0'); - neighbourFrame.remove(); - - _this.player.widgets[0].freePlayer(); - $('.LdtPlayer').remove(); - $('body').append('
'); - _this.reaffectKeyPress(); - - //On grise le snapshot qu'on vient de quitter. - _this.previousZoomedSN.animate( - { - opacity: '0.4' - }); - - //On se déplace. - $('#mainPanel').animate( - { - top: MPCurrentTop, - left: MPCurrentLeft - }, _this.config['timeMovingToNeighbour'], function() - { - //On fait apparaître le snapshot vers lequel on s'est déplacé. - $('#snapshotDiv-' + destinationId).animate( - { - opacity: '1' - }, _this.config['zoomTime'], function() - { - //On recharge les voisins. - $('.snapshotDivs').unbind('mouseenter', _this.selectNeighbour); - _this.previousZoomedSN = $('#snapshotDiv-' + _this.centerId); - _this.listenToNeighbours(); - - _this.notifyTopVideo = MPCurrentTop; - _this.notifyLeftVideo = MPCurrentLeft; - - _this.loadPlayer((destinationImg.position().top + MPCurrentTop + _this.MPTop_margin), (destinationImg.position().left + MPCurrentLeft), destinationImg.width(), destinationImg.height(), MPCurrentTop, MPCurrentLeft); - }); - }); -} - -/* - * Déchargement du contenu de la mosaïque pour le chargement de la mosaïque locale. - */ -mosaic.prototype.unload = function() -{ - //On supprime les event listeners des objets de la mosaïque. - $('.snapshotDivs').unbind(); - $('.snapshots').unbind(); - $('.prezoomContainers').unbind(); - //On supprime physiquement les objets. - $('#mainPanel').empty(); -} - -/* - * Centre verticalement un snapshot. - */ -/*function verticalCenterImg(mosaic, img) -{ - //On récupère sa hauteur. - var image_height = img.height(); - //Calcule la marge du haut de chaque div pour le centrage. - if(mosaic.top_margin == undefined) - mosaic.top_margin = (mosaic.snapshotHeight > image_height) ? (mosaic.snapshotHeight - image_height)/2 : (image_height - mosaic.snapshotHeight)/2; - //On centre le snapshot. - img.css('margin-top', mosaic.top_margin).css('margin-bottom', mosaic.top_margin); -}*/ - -/* - * Permet de tester l'égalité des éléments de deux objets. + * Permet de tester l'égalité des éléments de deux objets. * Pour ce faire on compare les éléments définissant ces objets. */ $.fn.equals = function(compareTo) @@ -1189,21 +1069,23 @@ if(_this.config['local'] == 'true') { _this.affectVideoById(val_video.metadata, meta.medias[0].url.replace('rtmp://media.iri.centrepompidou.fr/ddc_player/', './player/videos/').replace('mp4:', '').replace('video/', '').replace('ldtplatform/', '').replace('.m4v', '.mp4')); - console.log(meta.medias[0].url.replace('rtmp://media.iri.centrepompidou.fr/ddc_player/', './player/videos/').replace('mp4:', '').replace('video/', '').replace('ldtplatform/', '').replace('.m4v', '.mp4')); + // console.log(meta.medias[0].url.replace('rtmp://media.iri.centrepompidou.fr/ddc_player/', './player/videos/').replace('mp4:', '').replace('video/', '').replace('ldtplatform/', '').replace('.m4v', '.mp4')); } else { _this.affectVideoById(val_video.metadata, meta.medias[0].url.replace('rtmp://', 'http://').replace('/ddc_player/', '/').replace('mp4:', '').replace('.m4v', '.mp4')); - console.log(meta.medias[0].url.replace('rtmp://', 'http://').replace('/ddc_player/', '/').replace('mp4:', '').replace('.m4v', '.mp4')); + // console.log(meta.medias[0].url.replace('rtmp://', 'http://').replace('/ddc_player/', '/').replace('mp4:', '').replace('.m4v', '.mp4')); } }); _this.imgs[_this.ids[i]] = val_video.snapshot; _this.urls[_this.ids[i]] = val_video.metadata; - console.log('ids : ' + _this.ids[i]); + //Au départ, on commence à 0 ms dans les vidéos. + _this.timeToGoAt[_this.ids[i]] = 0; + // console.log('ids : ' + _this.ids[i]); i++; }); }); - console.log('rdy'); + // console.log('rdy'); _this.loadMosaic(); }); } @@ -1224,476 +1106,6 @@ } /* - * Lance une recherche par courbes. - */ -mosaic.prototype.startSearch = function() -{ - var top, left, width, height, margin_top, inMosaic; - //Si on est dans le cas d'un filtrage de mosaïque. - if(this.currentMode == "FILTER") - { - var mainPanel = $('#mainPanel'); - top = mainPanel.position().top; - left = mainPanel.position().left; - width = mainPanel.width(); - height = mainPanel.height(); - margin_top = this.MPTop_margin; - inMosaic = true; - } - //Sinon si c'est une recherche dans la vidéo. - else if(this.currentMode == "SEARCH") - { - top = this.snTop; - left = this.snLeft; - width = this.snWidth; - height = this.snHeight; - margin_top = '0px'; - inMosaic = false; - } - - this.searchCanvas = new searchCanvas(top, left, width, height, margin_top, this.timeSearchFade, inMosaic); - this.searchCanvas.create(); -} - -/* - * Quitte une recherche par courbes. - */ -mosaic.prototype.leaveSearch = function() -{ - this.searchCanvas.leaveSearch(); -} - -/* =============================================== - * * - * ZONE DES NOTIFICATIONS * - * * - =============================================== */ - -/* - * Affiche la notification de sélection/recherche lorsque la mosaique est complète. -*/ -mosaic.prototype.notifySelectionSearchMosaicFull = function() -{ - if(this.currentMode == "NO-USER" || this.currentMode.indexOf("INCOMING") == -1) - { - return; - } - - //On spécifie les notifications en div. - var notification_selection = "
"; - var notification_search = ""; - - //On les ajoute à la mosaïque. - $('#mainPanel').append(notification_selection + notification_search); - - //On calcule leurs coordonnées et dimensions. - var notify_width = $('.notifications').width(), notify_height = $('.notifications').height(); - var notify_margin = parseInt($('.notifications').css('margin')); - var selection_left = $(window).width() / 2 - (notify_width * 2 + notify_margin * 3) / 2; - var search_left = selection_left + notify_width + notify_margin; - - //On les positionne. - $('#notify_selection').css( - { - left: selection_left - }); - $('#notify_search').css( - { - left: search_left - }); - - //On les fait apparaître. - $('.notifications').css( - { - opacity: "0.9" - }); -} - -/* - * Supprime la notification de sélection/recherche lorsque la mosaique est complète. -*/ -mosaic.prototype.removeSelectionSearchMosaicFull = function() -{ - $('#notify_selection, #notify_search').remove(); -} - -/* - * Affiche la notification de maintient du pointage lors d'une phase de prézoom. -*/ -mosaic.prototype.notifyPointMosaicPrezoom = function() -{ - if($('#notify_point').length > 0 || this.currentMode == "NO-USER" || this.currentMode.indexOf("INCOMING") == -1) - { - return; - } - - //On spécifie les notifications en div. - var notification_point = "
"; - - //On les ajoute à la mosaïque. - $('#mainPanel').append(notification_point); - - //On calcule leurs coordonnées et dimensions. - var notify_width = $('.notifications').width(), notify_height = $('.notifications').height(); - var notify_margin = parseInt($('.notifications').css('margin')); - var point_left = $(window).width() / 2 - (notify_width) / 2 - notify_margin; - - //On les positionne. - $('#notify_point').css( - { - left: point_left - }); - - //On les fait apparaître. - $('.notifications').css( - { - opacity: "0.9" - }); -} - -/* - * Supprime la notification de maintient du pointage. -*/ -mosaic.prototype.removePointMosaicPrezoom = function() -{ - $('#notify_point').remove(); -} - -/* - * Affiche l'aide. -*/ -mosaic.prototype.notifyHelp = function() -{ - if(this.helpDisplayed) - { - return; - } - - this.removeSelectionSearchMosaicFull(); - this.removePointMosaicPrezoom(); - - this.helpDisplayed = true; - - var search_2hands_tab = ['no_motion', 'right_angle', 'contact', 'grand_jete', 'circle', 'screw', 'arc', 'rythme', 'slow', 'up_down', 'wave', 'wheel']; - var search_body_tab = ['bend', 'fall', 'jump', 'hello', 'knee_up']; - var controls_1hand_tab = ['selection']; - - //On spécifie les notifications en div. - var search_title = "
"; - var search_img = "
"; - var search_2hands_text = "
"; - var search_2hands_imgs = "
"; - - for(var i = 0 ; i < search_2hands_tab.length ; i++) - { - search_2hands_imgs += "
"; - } - search_2hands_imgs += "
"; - - var search_body_text = "
"; - var search_body_imgs = "
" - - for(var i = 0 ; i < search_body_tab.length ; i++) - { - search_body_imgs += "
"; - } - search_body_imgs += "
"; - - var controls_title = "
"; - var controls_img = "
"; - var controls_1hand_text = "
"; - var controls_1hand_imgs = "
"; - - for(var i = 0 ; i < controls_1hand_tab.length ; i++) - { - controls_1hand_imgs += "
"; - } - controls_1hand_imgs += "
"; - - var help_search = ""; - var help_controls = "
" + controls_title + controls_img + controls_1hand_text + controls_1hand_imgs + "
"; - - var notification_help = "
" + help_search + "
" + help_controls + "
"; - - //On les ajoute à la mosaïque. - $('body').append(notification_help); - - //On calcule leurs coordonnées et dimensions. - var notify_width = $(window).width(), notify_height = $(window).height(); - var notify_margin = parseInt($('#notify_help').css('margin')); - var notify_ = 10; - - //On les positionne. - $('#notify_help').css( - { - left: "0px", - top: "0px", - width: notify_width - notify_margin * 2, - height: notify_height - notify_margin * 2 - }); - - var search_width = $('#help_search').width(); - - $('#search_title').html('Recherche'); - $('#search_2hands_text').html('Gestes à effectuer avec les deux mains'); - $('#search_body_text').html('Gestes à effectuer avec le corps entier'); - - for(var i = 0 ; i < search_2hands_tab.length ; i++) - { - $("#2hands_" + search_2hands_tab[i]).css("background-image", "url('./pictos/help/" + search_2hands_tab[i] + ".png')"); - //console.log("url('../../pictos/help/" + search_2hands_tab[i] + ".png')"); - } - - for(var i = 0 ; i < search_body_tab.length ; i++) - { - $("#body_" + search_body_tab[i]).css("background-image", "url('./pictos/help/" + search_body_tab[i] + ".png')"); - //console.log("url('../../pictos/help/" + search_2hands_tab[i] + ".png')"); - } - - $('#controls_title').html('Contrôles'); - $('#controls_1hand_text').html('Gestes à effectuer avec une seule main'); - - for(var i = 0 ; i < controls_1hand_tab.length ; i++) - { - $("#1hand_" + controls_1hand_tab[i]).css("background-image", "url('./pictos/help/" + controls_1hand_tab[i] + ".png')"); - //console.log("url('../../pictos/help/" + search_2hands_tab[i] + ".png')"); - } - - //On les fait apparaître. - $('#notify_help').css( - { - opacity: "1" - }); - - $('.notify_imgs_big').css( - { - opacity: "1" - }); -} - -/* - * Supprime l'aide. -*/ -mosaic.prototype.removeHelp = function() -{ - if(!this.helpDisplayed) - { - return; - } - - var _this = this; - - $('#notify_help').fadeOut(this.timeNotifyFade, function() - { - _this.helpDisplayed = false; - $('#notify_help').remove(); - }); -} - -/* - * Affiche les types de marqueurs correspondants à ce qu'on a commencé à tracer lors d'une recherche. -*/ - mosaic.prototype.notifySearchMarkers = function(markersStr) -{ - if($('.notifications_inSearch_container').length > 0) - { - return; - } - - console.log(markersStr); - - var markersList = markersStr.split(new RegExp(';')); - - var notification_search_markers = "
"; - - //On spécifie les notifications en div. - for(var i = 0 ; i < markersList.length ; i++) - { - notification_search_markers += "
"; - } - - notification_search_markers += "
"; - - //On les ajoute à la mosaïque. - $('#mainPanel').append(notification_search_markers); - - //On calcule leurs coordonnées et dimensions. - var notify_width = $('.notifications_inSearch_container').width(), notify_height = $('.notifications_inSearch_container').height(); - var notify_margin = parseInt($('.notifications_inSearch').css('margin')); - var point_left = $(window).width() / 2 - (notify_width) / 2 - notify_margin; - var point_top = 0; - - if(this.currentMode == "VIDEO" || this.currentMode == "SEARCH") - { - point_top = -this.notifyTopVideo, - point_left = -this.notifyLeftVideo + ($(window).width() - notify_width) / 2 - } - - //On les positionne. - $('.notifications_inSearch_container').css( - { - left: point_left, - top: point_top - }); - - //On les fait apparaître. - $('.notifications_inSearch').css( - { - opacity: "0.9" - }); -} - -/* - * Supprime la notification de maintient du pointage. -*/ -mosaic.prototype.removeSearchMarkers = function() -{ - $('.notifications_inSearch_container').remove(); -} - -/* - * Effectuer un filtrage de la mosaïque par rapport à un type de marqueurs. -*/ -mosaic.prototype.searchFilter = function(type) -{ - var _this = this; - - if(this.currentMode == "MOSAIC") - { - this.currentMode = "FILTER"; - - if(this.annotations.length > 0) - { - var gestureNumberByVideo = new Object(); - var maxAnnotationNumber = 0; - // for(var i = 0 ; i < this.config['imagesToShow'] ; i++) - for(var i = 0 ; i < this.annotations.length ; i++) - { - var current = this.annotations[i]; - if(current.annotationType.contents.title == type) - { - if(gestureNumberByVideo[current.source.url] == undefined || gestureNumberByVideo[current.source.url] == '') - { - gestureNumberByVideo[current.source.url] = 0; - } - - gestureNumberByVideo[current.source.url]++; - } - } - - for(var i = 0 ; i < this.urls.length ; i++) - { - if(gestureNumberByVideo[this.urls[i]] == undefined || gestureNumberByVideo[this.urls[i]] == '') - { - gestureNumberByVideo[this.urls[i]] = 0; - } - } - - //On récupère la vidéo qui score le nombre d'occurences de la gesture le plus haut. - for(i in gestureNumberByVideo) - { - // console.log(i + " " + gestureNumberByVideo[i]); - if(maxAnnotationNumber < gestureNumberByVideo[i]) - { - maxAnnotationNumber = gestureNumberByVideo[i]; - } - } - - var snMargin = parseInt($('.snapshotDivs').css('margin')); - - //On affiche l'opacité résultante pour chaque vidéo. - for(i in gestureNumberByVideo) - { - //Opacité conventionelle. - var opacity = gestureNumberByVideo[i] / maxAnnotationNumber; - // console.log('opacity b : ' + opacity + ' for ' + gestureNumberByVideo[i]); - //Ce qui est à zéro le restera (par conséquent le snapshot associé sera invisible). - if(opacity > 0) - { - //On réhausse l'opacité de 50%. - opacity = this.scaleIntervals(0., 1., 0.5, 1., opacity); - } - - var filterIndex = this.getIdxFromMetadata(i); - - if(filterIndex >= 0) - { - console.log('#snapshotDiv-' + filterIndex + " " + _this.config['timeFilterFade'] + " " + opacity); - $('#snapshotDiv-' + filterIndex).fadeTo(_this.config['timeFilterFade'], opacity); - - if(opacity == 0) - { - var filteredSnapshot = $('#snapshotDiv-' + filterIndex); - - if(filteredSnapshot.length > 0) - { - var hider = '
'; - $('#mainPanel').append(hider); - - $('#filterHider-' + filterIndex).css( - { - width: +filteredSnapshot.width() + 4 * snMargin, - height: +filteredSnapshot.height() + 4 * snMargin, - top: filteredSnapshot.position().top - snMargin, - left: filteredSnapshot.position().left - snMargin - }); - } - } - } - } - } - } -} - -/* - * Passe une valeur de l'intervalle [A, B] à l'intervalle [C, D]. -*/ -mosaic.prototype.scaleIntervals = function(A, B, C, D, val) -{ - return (D - C + A) * val + (C - A); -} - -/* - * Retourne l'index d'un snapshot en fonction de ses metadonnées. -*/ -mosaic.prototype.getIdxFromMetadata = function(metadata) -{ - var _this = this; - - for(idx in this.urls) - { - if(this.urls[idx] == metadata) - { - for(id in this.ids) - { - if(this.ids[id] == idx) - { - return id; - } - } - } - } - - return -1; -} - -/* - * Enlève une recherche par filtre. -*/ -mosaic.prototype.removeFilter = function() -{ - if(this.currentMode == "FILTER") - { - this.currentMode = "MOSAIC"; - - var _this = this; - - $('.filterHiders').remove(); - $('.snapshotDivs').fadeTo(_this.config['timeFilterFade'], 1); - } -} - -/* * Rebind keypress pour body. */ mosaic.prototype.reaffectKeyPress = function() @@ -1704,4 +1116,20 @@ { _this.manageControlEvents(event); }); -} \ No newline at end of file +} + +mosaic.prototype.date = function() +{ + var date, h, min, s; + date = new Date(); + h = date.getHours(); + min = date.getMinutes(); + s = date.getSeconds(); + if (h < 10) + h = "0" + h; + if (min < 10) + min = "0" + min; + if (s < 10) + s = "0" + s; + return (h + ":" + min + ":" + s); +}; \ No newline at end of file