]> git.parisson.com Git - telemeta.git/commitdiff
fixed popup bug
authorriccardo <riccardo@parisson.com>
Fri, 10 Jun 2011 13:12:13 +0000 (15:12 +0200)
committerriccardo <riccardo@parisson.com>
Fri, 10 Jun 2011 13:12:13 +0000 (15:12 +0200)
telemeta/htdocs/js/playerLoader.js
telemeta/htdocs/timeside/js/player.js
telemeta/htdocs/timeside/js/timeside.js
telemeta/htdocs/timeside/skins/lab/style.css
telemeta/templates/telemeta_default/mediaitem_detail.html

index d530364f5032cbf5b90309d7902692e8d97de304..1f9b5095ef3796af882f603ce44afe653187e3bf 100644 (file)
@@ -58,7 +58,7 @@ function togglePlayerMaximization() {
 
 
 
-function loadPlayer(analizerUrl, soundUrl, itemId, visualizers, currentUserName, isStaffOrSuperuser){
+function loadPlayer(analizerUrl, soundUrl, soundImgSize, itemId, visualizers, currentUserName, isStaffOrSuperuser){
     var $J = jQuery;
     var wdw = window;
 
@@ -225,7 +225,7 @@ function loadPlayer(analizerUrl, soundUrl, itemId, visualizers, currentUserName,
                 }
 
                 //function(container, soundUrl, durationInMsec, visualizers, markerMap, showAddMarkerButton, onError,onReady ){
-                Timeside.load(playerDiv,soundUrl,timeInMSecs,imageSrcFcn,markerMap,markerMode, function(msg){
+                Timeside.load(playerDiv,soundUrl,timeInMSecs,imageSrcFcn,soundImgSize,markerMap,markerMode, function(msg){
                     end(msg);
                 },
                 function(player){
@@ -365,38 +365,58 @@ function loadPlayer(analizerUrl, soundUrl, itemId, visualizers, currentUserName,
                         wdw.onbeforeunload = confirmExit;
                     }
                     if(map && wdw.PopupDiv){
-                        var popupdiv = new PopupDiv({
-                            focusable: false,
-                            titleClass: 'markersdivTitle',
-                            showClose:false,
-                            bounds: {
-                                top:0.4,
-                                left:0.1,
-                                right:0.1,
-                                bottom:0
-                            },
-                            invoker: player.getContainer().find('.ts-wave'),
-                            defaultCloseOperation: 'hide'
-                        });
-                        var closeTimeout = undefined;
-                        var ci = clearTimeout;
-                        player.bind('markerCrossed',function(data){
-                            if(closeTimeout !== undefined){
-                                cl(closeTimeout);
-                            }
-                            closeTimeout=undefined;
-                            popupdiv.refresh(data.marker.desc,data.marker.title);
-                            if(!popupdiv.isShowing()){
-                                popupdiv.show();
-                            }
-                            var index = data.index;
-                            if(index+1 == map.length || map.toArray()[index+1].offset-data.marker.offset>3){
-                                closeTimeout = popupdiv.setTimeout('close',3000);
-                            }
-                            //consolelog('firing markercrossed');
-                            //consolelog(data.marker.title);
+                        var POPUP_TIMEOUT=3; //in seconds. Zero means: no popup, negative numbers:
+                        //popup stays infinitely on the player (until next marker cross)
+                        //a number N means: popup stays maximum N seconds on the screen
+                        if(POPUP_TIMEOUT){
+                            var popupdiv = new PopupDiv({
+                                focusable: false,
+                                titleClass: 'markersdivTitle',
+                                showClose:false,
+                                bounds: {
+                                    top:0.4,
+                                    left:0.1,
+                                    right:0.1,
+                                    bottom:0
+                                },
+                                invoker: player.getContainer().find('.ts-wave'),
+                                defaultCloseOperation: 'hide'
+                            });
+                            var popupShowFunction = function(data){
+//                                    if(popupTimeoutId !== undefined){
+//                                        cT(popupTimeoutId);
+//                                    }
+//                                    popupTimeoutId=undefined;
+                                    popupdiv.refresh(data.marker.desc,data.marker.title);
+                                    if(!popupdiv.isShowing()){
+                                        popupdiv.show();
+                                    }
+//                                    var index = data.index;
+//                                    if(index+1 == map.length || map.toArray()[index+1].offset-data.marker.offset>3){
+//                                        popupTimeoutId = popupdiv.setTimeout('close',3000);
+//                                    }
+                                };
+                            if(POPUP_TIMEOUT<0){
+                                player.bind('markerCrossed',popupShowFunction);
+                            }else{
+                                var popupTimeoutId = undefined;
+                                var cT = clearTimeout;
+                                player.bind('markerCrossed',function(data){
+                                    if(popupTimeoutId !== undefined){
+                                        cT(popupTimeoutId);
+                                    }
+                                    popupTimeoutId=undefined;
+                                    popupShowFunction(data);
+                                    var index = data.index;
+                                    if(index+1 == map.length || map.toArray()[index+1].offset-data.marker.offset>3){
+                                        popupTimeoutId = popupdiv.setTimeout('close',3000);
+                                    }
+                                //consolelog('firing markercrossed');
+                                //consolelog(data.marker.title);
                             
-                        });
+                                });
+                            }
+                        }
                     }
 
                     //set up the marker tab
index efddcbbd53da70d1c916b2ed34dada7958e7904d..affc5ea898ca63a1c19647814ef9482a1870c8ca 100644 (file)
@@ -32,11 +32,14 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
     
     //sound duration is in milliseconds because the soundmanager has that unit,
     //player (according to timeside syntax) has durations in seconds
-    init: function(container, sound, soundDurationInMsec, imageCallback, newMarkerCallback) {
+    // newMarkerCallback must be either a string or a function, the necessary checks is done in Timeside.load
+    // (which calls this method)
+    //if markersArray is not an array, it defaults to []
+    init: function(container, sound, soundDurationInMsec, soundImgFcn, soundImgSize, markersArray, newMarkerCallback) {
         this._super();
 
         //container is the div #player
-        
+       
         if (!container){
             this.debug('ERROR: container is null in initializing the player');
         }
@@ -47,12 +50,15 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         this.getSound = function(){
             return sound;
         }
-        if(typeof imageCallback == 'string'){
-            var url = imageCallback;
-            this.imageCallback =  new function(w,h){return url;} ;
-        }else{
-            this.imageCallback = imageCallback;
+        if(typeof soundImgFcn == 'string'){
+            var url = soundImgFcn;
+            this.imageCallback =  new function(w,h){
+                return url;
+            };
+        }else if(typeof soundImgFcn === 'function'){
+            this.imageCallback = soundImgFcn;
         }
+
         var sd = this.toSec(soundDurationInMsec);
         this.getSoundDuration = function(){
             return sd;
@@ -78,10 +84,10 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         //                }
         //        };
         
-        var currentMarkerIndex=0;
-        this.getCurrentMarkerIndex = function(){
-            return currentMarkerIndex;
-        };
+        //        var currentMarkerIndex=0;
+        //        this.getCurrentMarkerIndex = function(){
+        //            return currentMarkerIndex;
+        //        };
 
 
         //initializing markermap and markerui
@@ -90,28 +96,33 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
             return map;
         }
 
+        var canAddMarkers = false;
         if(newMarkerCallback){
-            this.canAddMarker = function(){
-                return true;
-            }
+            //            this.canAddMarker = function(){
+            //                return true;
+            //            }
+            canAddMarkers = true;
             if(typeof newMarkerCallback === 'function'){
                 this.newMarker = newMarkerCallback;
             }
-        }else{
-            this.canAddMarker = function(){
-                return false;
-            }
         }
+        //        else{
+        //            this.canAddMarker = function(){
+        //                return false;
+        //            }
+        //        }
 
 
-    },
+        // },
 
-     //sets up the player interface and loads the markers. There is theoretically no need for this method, as it might be included in
-    //the init constructor, it is separated for "historical" reasons: this method stems from the old _setupInterface,
-    //which was a separate method in the old player code. Future releases might include it in the init constructor
-    setupInterface: function(markersArray) {
+        //sets up the player interface and loads the markers. There is theoretically no need for this method, as it might be included in
+        //the init constructor, it is separated for "historical" reasons: this method stems from the old _setupInterface,
+        //which was a separate method in the old player code. Future releases might include it in the init constructor
+        //  setupInterface: function(markersArray) {
 
-        var sound = this.getSound();
+        //removed"
+        //      var sound = this.getSound();
+        //removed"
         this.debug('player _setupInterface sound.readyState:'+sound.readyState); //handle also cases 0 and 2????
 
         var $J = this.$J; //defined in the super constructor
@@ -155,8 +166,13 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         //"</div>",
         "</div>"];
 
-        this.getContainer().html(html.join(''));
-        var container = this.getContainer();
+        //removed"
+        //this.getContainer().html(html.join(''));
+        //var container = this.getContainer();
+        //removed"
+        //added"
+        container.html(html.join(''));
+        //added"
 
         var control = container.find('.ts-control');
 
@@ -189,13 +205,17 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
 
         var setMarkerButton = control.find('.ts-set-marker');
 
-        var canAddMarkers = this.canAddMarker();
+        //removed"
+        //var canAddMarkers = this.canAddMarker();
+        //removed"
 
         if(canAddMarkers){
             setMarkerButton.show().attr('href','#').unbind('click').bind('click', function(){
                 me.addMarker(me.getSoundPosition());
                 return false;
             });
+        }else{
+            setMarkerButton.hide().unbind('click');
         }
 
 
@@ -246,9 +266,9 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
             'display':'inline-block',
             'overflow':'hidden'
         });
-        if(!canAddMarkers){
-            setMarkerButton.hide().unbind('click');
-        }
+        //        if(!canAddMarkers){
+        //            setMarkerButton.hide().unbind('click');
+        //        }
 
         var waitImg = control.find('.ts-wait');
         waitImg.html('wait').css({
@@ -274,7 +294,15 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
             return ruler;
         }
 
-        this.resize(); //which calls also ruler.resize() (see below)
+        //setting image size (if provided) and resize player. Note that _setImageSize (with underscore) is intended to be
+        //a private method (faster). setImageSize (without underscore) is the public method to use outside of player object
+        if(soundImgSize){
+            this._setImageSize(soundImgSize.width,soundImgSize.height,container, wave,true); //calls this.resize which calls ruler.resize
+        }else{
+            this._setImageSize('','',container, wave,true); //calls this.resize which calls ruler.resize
+        }
+
+        //this.resize(); //which calls also ruler.resize() (see below)
 
 
         //binds click for the pointer
@@ -293,7 +321,9 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         //NOTE: loadMarkers ASYNCHRONOUSLY CALLS THE SERVER, SO METHODS WRITTEN AFTER IT MIGHT BE EXECUTED BEFORE
         //loadMarkers has finished its job
         //this.loadMarkers(callback);
-
+        if(!(markersArray) || !(markersArray.length)){
+            markersArray = [];
+        }
         this.loadMarkers(markersArray);
     },
 
@@ -397,21 +427,27 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
                 var offs = marker.offset;
                 var intervalUpperBound =  offs+margin;
                 var intervalLowerBound =  offs-margin;
-                var data = {index:idx,marker:marker};
+                var data = {
+                    index:idx,
+                    marker:marker
+                };
                 fireOnMarkerPosition = function(seconds){
                     if(marker){
                         if(seconds>intervalLowerBound && seconds < intervalUpperBound){
-                             player.fire('markerCrossed',data);
-                             idx++;
-                             if(idx<len){
-                                 marker = markers[idx];
-                                 offs = marker.offset;
-                                 intervalUpperBound =  offs+margin;
-                                 intervalLowerBound =  offs-margin;
-                                 data = {index:idx,marker:marker};
-                             }else{
-                                 marker = undefined;
-                             }
+                            player.fire('markerCrossed',data);
+                            idx++;
+                            if(idx<len){
+                                marker = markers[idx];
+                                offs = marker.offset;
+                                intervalUpperBound =  offs+margin;
+                                intervalLowerBound =  offs-margin;
+                                data = {
+                                    index:idx,
+                                    marker:marker
+                                };
+                            }else{
+                                marker = undefined;
+                            }
                         }
                     }
                 };
@@ -457,7 +493,7 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
                                 player.soundPosition = sPosInSec;
                                 ruler.movePointer(sPosInSec);
                         }
-                                fireOnMarkerPosition(sPosInSec);
+                        fireOnMarkerPosition(sPosInSec);
                 }
 
             },
@@ -568,38 +604,61 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         
         var wave = container.find('.ts-wave');
 
-        //var image = wave.find('img.ts-image');
-        //if(!image.length){
-        //    image = this.$J('<img/>');
-        //}
+        
         height = wave.height();
         this.debug("wave height:" + height);
-        if (!height) {
-            //this.debug('ERROR: image height is zero in player.,resize!!!!')
-            //height = image.height();
-            //if (!height){
-            height = 200;
-        //}
-        }
+
+        if (height) {
+
         //set image, imagecontainer and canvas (container on imagecontainer for lines and pointer triangles) css
         var elements = wave.find('.ts-image-container').css('zIndex','0')
         .add(wave.find('.ts-image-canvas').css('zIndex','1')); //the two children of ts-wave. Set also the zIndex
         //in order to visualize the canvas OVER the wav image
 
-        elements.css('width', 'auto'); // for IE6. We leave it although IE6 is not anymore supported
+        //elements.css('width', 'auto'); // for IE6. We leave it although IE6 is not anymore supported
         var style = {
             width: wave.width(),
             height: height
         }
         elements.css(style);
         elements.css('position','absolute');
-        
+
+        }
+
         //refreshing images:
-        
+
         this.refreshImage();
         this.getRuler().resize();
 
-        return this;
+
+//
+//        if (!height) {
+//            //this.debug('ERROR: image height is zero in player.,resize!!!!')
+//            //height = image.height();
+//            //if (!height){
+//            height = 1; //200;
+//            wave.css('minHeight',height+'px');
+//        //}
+//        }
+//        //set image, imagecontainer and canvas (container on imagecontainer for lines and pointer triangles) css
+//        var elements = wave.find('.ts-image-container').css('zIndex','0')
+//        .add(wave.find('.ts-image-canvas').css('zIndex','1')); //the two children of ts-wave. Set also the zIndex
+//        //in order to visualize the canvas OVER the wav image
+//
+//        elements.css('width', 'auto'); // for IE6. We leave it although IE6 is not anymore supported
+//        var style = {
+//            width: wave.width(),
+//            height: height
+//        }
+//        elements.css(style);
+//        elements.css('position','absolute');
+//
+//        //refreshing images:
+//
+//        this.refreshImage();
+//        this.getRuler().resize();
+//
+//        return this;
     },
     getImageUrl : function(){
         var image = this.getContainer().find('.ts-image');
@@ -618,7 +677,14 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
         //            image = container.find('.ts-image');
         //        }
 
+        //consolelog(this);
+
         var size = this.getImageSize();
+
+        if(!size.width || !size.height){
+            consolelog('size is zero!!!!');
+            return;
+        }
         var imgSrc = this.imageCallback(size.width,size.height);
         var imageNotYetCreated = image.length == 0;
         if(!imageNotYetCreated && image.attr('src')==imgSrc){
@@ -662,10 +728,31 @@ Timeside.classes.Player = Timeside.classes.TimesideClass.extend({
             height:wave.height()
         }
     },
+
     setImageSize: function(width,height){
-        var wave = this.getContainer().find('.ts-wave');
-        wave.css({'width':width,'height':height});
-        this.resize();
+        var container = this.getContainer();
+        var wave = container.find('.ts-wave');
+        this._setImageSize(width,height,container, wave,true);
+    },
+    //this is intended to be a private method, use setImageSize from outside the player object)
+    _setImageSize: function(width,height,jQueryContainerElement, jQueryWaveElement, resize){
+        if(width || height){
+            consolelog('SETTING SIZE!!!');
+            var re = /(?:px|ex|em|%)$/;
+            if(width){
+                width+='';
+                width = re.exec(width) ? width : width+'px';
+                jQueryContainerElement.css('width',width);
+            }
+            if(height){
+                height+='';
+                height = re.exec(height) ? height : height+'px';
+                jQueryWaveElement.css('height',height);
+            }
+        }
+        if(resize){
+            this.resize();
+        }
     },
 
     getSoundVolume :function(){
index 6336c89c1b28c0b9bd25b3e71ba7f784ffa80f63..3afa2013a9e4e7a3e23b18247f6312edeec49842 100644 (file)
@@ -382,7 +382,11 @@ Timeside.classes.TimesideClass = Timeside.Class.extend({
             var l = rules.length;
             for(var j=0; j <l; j++){
                 var rule = rules[j];
+//                if(i==2){
+//                    consolelog(rule.selectorText);
+//                }
                 if(rule.selectorText == className){
+                    
                     var style = rule.style;
                     for(var k =0; k<availableAttrs.length; k++){
                         var val = style[availableAttrs[k]];
@@ -976,7 +980,7 @@ Timeside.loadScripts = function(){
 }
 
 
-Timeside.load =function(container, soundUrl, durationInMsec, soundImgFcn, markerMap, newMarkerCallback, onError, onReady){
+Timeside.load =function(container, soundUrl, durationInMsec, soundImgFcn, soundImgSize, markersArray, newMarkerCallback, onError, onReady){
 
     var $J = jQuery;
     var playerDiv = container;
@@ -1001,13 +1005,11 @@ Timeside.load =function(container, soundUrl, durationInMsec, soundImgFcn, marker
         return;
     }
 
-    if(!(soundImgFcn)){
+    if(!(typeof soundImgFcn == 'string' || typeof soundImgFcn === 'function')){
         onError('invalid sound image. Provide a callback(width,height) or a string denoting a valid url');
         return;
     }
-    if(!(markerMap) || !(markerMap.length)){
-        markerMap = [];
-    }
+  
 
     $J(window).ready(function(){
         //if soundmanager is ready, the callback is executed immetiately
@@ -1038,8 +1040,9 @@ Timeside.load =function(container, soundUrl, durationInMsec, soundImgFcn, marker
             });
             
             Timeside.loadScripts(thisScriptPath,['rulermarker.js','markermap.js', 'player.js', 'ruler.js'], function() {
-                var p = new Timeside.classes.Player(playerDiv, sound, durationInMsec, soundImgFcn,newMarkerCallback);
-                p.setupInterface(markerMap || []);
+                var p = new Timeside.classes.Player(playerDiv, sound, durationInMsec, soundImgFcn, soundImgSize,
+                markersArray,newMarkerCallback);
+                //p.setupInterface(markerMap || []);
                 Timeside.player = p;
                 onReady(p);
                 return false;
index 94371d1455df9471ef3e878cb2568d2f245c048a..b97731928344d6d370c38c9df7d7d6611eed83e1 100755 (executable)
     font-size: 10px;
     line-height: 13px;
 }
-
-.ts-skin-lab .ts-player .ts-ruler .ts-svg-ruler-upper-rect{
+/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED:
+  ".ts-skin-lab .ts-player .ts-ruler .ts-svg-ruler-upper-rect" */
+.ts-svg-ruler-upper-rect{
     fill:  #595959;
     stroke-width:0;
     stroke: #595959; /*to be sure...*/
 }
-.ts-skin-lab .ts-player .ts-ruler .ts-svg-ruler-lines{
+/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED:
+  ".ts-skin-lab .ts-player .ts-ruler .ts-svg-ruler-lines"*/
+.ts-svg-ruler-lines{
     stroke-width:1;
     stroke:#ADADAD;
 }
 .ts-skin-lab .ts-player .ts-wave {
     height: 130px;
 }
-.ts-skin-lab .ts-player .ts-wave .ts-image {
+
+/*.ts-skin-lab .ts-player .ts-wave .ts-image {
     width: 360px;
     height: 130px;
     background: transparent;
-}
+}*/
 
 /*.ts-skin-lab .ts-player {
   background: #3c4251;
     /*color: white;
     background: #7290bc;*/
 }
-
-.ts-skin-lab .ts-player .ts-wave .ts-image-canvas .ts-svg-marker-line {
+/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED:
+  ".ts-skin-lab .ts-player .ts-wave .ts-image-canvas .ts-svg-marker-line" */
+.ts-svg-marker-line {
     fill: #e65911;
     stroke-width:0;
 }
     border-radius: .3em !important;
     /*color: #3c4251; #6A0307 !important;*/
 }
-
-.ts-skin-lab .ts-player .ts-wave .ts-image-canvas .ts-svg-pointer-line {
+/*svg style, MUST BE A SINGLE SELECTOR. FOR INSTANCE, THIS DOES NOT WORK WHEN SVG IS NOT SUPPORTED:
+  ".ts-skin-lab .ts-player .ts-wave .ts-image-canvas .ts-svg-pointer-line" */
+.ts-svg-pointer-line {
     fill: #BB0000;
     stroke-width:0;
 }
index 6f4d990a042cd3305615629047cb56371600f447..f69faab5e90798cf7c39b708980327bfd53d5ad2 100644 (file)
@@ -59,7 +59,7 @@
     var superuser = false;
    {% endif %}
     loadPlayer('{% url telemeta-item-analyze-xml item.public_id %}',
-    "{% url telemeta-item-export item.public_id,"mp3" %}", '{{item.id}}', visualizers, CURRENT_USER_NAME, superuser);
+    "{% url telemeta-item-export item.public_id,"mp3" %}", undefined, '{{item.id}}', visualizers, CURRENT_USER_NAME, superuser);
 
 </script>
 {% endif %}