Author: andre
Date: 2010-03-10 23:03:05 +0100 (Wed, 10 Mar 2010)
New Revision: 41320
Modified:
openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js
Log:
improved slider and tracking
Modified: openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js
===================================================================
--- openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js
2010-03-10 08:38:36 UTC (rev 41319)
+++ openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js
2010-03-10 22:03:05 UTC (rev 41320)
@@ -21,7 +21,7 @@
* 'server' : server url (think only for ie)
* 'jar' : JAR file of Cortado
* 'flash' : location of flowplayer.swf
- * 'controls' : to show and use controls or not
+ * 'controls' : to show and use controls or not (make sure to include
jquery-ui-1.7.2.slider.js when true)
*
* @changes: added seek, fullscreen and mute
* @version: '$Id$'
@@ -36,7 +36,7 @@
flash : '/player/plugins/flowplayer-3.1.1.swf',
controls : true
}, conf);
-
+
var mediatags = $(this).find('video, audio');
$.each(mediatags, function(i, mt) {
var sources = $(mt).find('source');
@@ -57,7 +57,7 @@
if ($.browser.msie) {
//$('p.oiplayer-warn').hide(); // MSIE places stuff partly
outside mediatag
}
-
+
$(div).find('img.oipreview').click(function(ev) {
ev.preventDefault();
start(player, div);
@@ -75,7 +75,8 @@
if ($(ctrls).find('li.pause').length == 0) {
$(ctrls).find('li.play').addClass('pause');
}
- $.oiplayer.follow(player, timer);
+ var slider = $(ctrls).find("li.slider > div");
+ $.oiplayer.follow(player, timer, slider);
} else if (player.state == 'play') {
player.pause();
$(ctrls).find('li.play').removeClass('pause');
@@ -84,6 +85,7 @@
}
//console.log("player state: " + player.state);
});
+
$(ctrls).find('li.sound a').click(function(ev){
if (player.state != 'init') {
player.mute();
@@ -94,6 +96,26 @@
ev.preventDefault();
fullscreen(player, div);
});
+
+ console.log("duration: " + player.duration + ", start: " +
player.start);
+ if (player.duration) { // else no use
+ $(ctrls).find("li.slider > div").slider({
+ animate: 'fast',
+ range: 'min',
+ value: (player.start ? player.start : 0),
+ max: Math.floor(player.duration),
+ step: 1
+ });
+ $(ctrls).find("li.slider > div").bind('slide',
function(ev, ui) {
+ newPos(player, ui.value);
+ });
+ $(ctrls).find("li.slider > div").bind('slidechange',
function(ev, ui) {
+ if (ev.originalEvent.type == "mouseup") {
+ newPos(player, ui.value);
+ }
+ });
+ }
+
}
});
@@ -101,6 +123,12 @@
return this; // plugin convention
});
+ function newPos(player, pos) {
+ player.seek(pos);
+ $('li.position').text($.oiplayer.totime(pos));
+ $('#value').text("positie: " + pos);
+ }
+
/* Mainly user interface stuff on first start of playing */
function start(player, div) {
if (player.type == 'video') {
@@ -121,7 +149,8 @@
if ($(ctrls).find('li.pause').length == 0) {
$(ctrls).find('li.play').addClass('pause');
}
- $.oiplayer.follow(player, timer);
+ var slider = $(ctrls).find("li.slider > div");
+ $.oiplayer.follow(player, timer, slider);
}
}
@@ -131,7 +160,7 @@
player.oheight = player.height;
}
var window_w = $(window).width();
- var window_h = $(window).height() - 25;
+ var window_h = $(window).height() - 35;
var multi_w = window_w / player.owidth;
var multi_h = window_h / player.oheight;
var half = 0;
@@ -298,17 +327,6 @@
}
}
- function findTag(el) {
- var o = new Object();
- o.type = "video";
- o.element = $(el).find('video')[0];
- if (o.element == undefined) {
- o.type = "audio";
- o.element = $(el).find('audio')[0];
- }
- return o;
- }
-
function supportMimetype(mt) {
var support = false; /* navigator.mimeTypes is unsupported by MSIE
! */
if (navigator.mimeTypes && navigator.mimeTypes.length > 0) {
@@ -334,6 +352,7 @@
function createControls() {
var html = '<div class="controls"><ul class="controls">' +
'<li class="play"><a title="play"
href="#play">play</a></li>' +
+ '<li class="slider"> <div> </div> </li>' +
'<li class="position">00:00</li>' +
'<li class="sound"><a title="mute"
href="#sound">mute</a></li>' +
'<li class="screen"><a title="fullscreen"
href="#fullscreen">fullscreen</a></li>' +
@@ -341,7 +360,7 @@
return html;
}
- function showInfo() {
+ function showInfo(player) {
var text = player.info;
var id = player.id;
if ($('#' + id).find('div.playerinfo').length > 0) $('#' +
id).find('div.playerinfo').remove();
@@ -359,23 +378,39 @@
/*
* Updates the provided html element with progress time of player
* @param player Object of player
- * @param el HTML element
+ * @param el HTML element to display status
+ * @param slider jquery.ui.slider to update
*/
- follow: function (player, el) {
- var pos = player.duration;
+ follow: function (player, el, slider) {
+ var pos = 0;
var progress = null;
+ var sec = player.start;
+ var now;
+ var i = 0;
clearInterval(progress);
progress = setInterval(function() {
pos = player.position();
- if (!isNaN(pos) && pos > 0) {
- $(el).text(toTime(pos));
+ sec = Math.floor(pos);
+ //console.log("n: " + now + ", s: " + sec + ", pos: " + pos);
+ if (!isNaN(pos) && pos > 0 && sec != now) {
+ $(el).text( $.oiplayer.totime(pos) );
+ $(slider).slider('option', 'value', sec);
+ i = 0;
+ now = sec;
}
- if (pos == undefined) {
+ if (now == sec) {
+ i++;
+ }
+ if (pos == undefined || i > 9) {
+ console.log("stopping... " + i);
+ player.pause(); // maybe stop?
clearInterval(progress);
return;
}
}, 200);
-
+ },
+
+ totime: function (pos) {
function toTime(sec) {
var h = Math.floor(sec / 3600);
var min = Math.floor(sec / 60);
@@ -386,15 +421,17 @@
}
return addZero(min) + ":" + addZero(sec);
}
-
+
function addZero(time) {
time = parseInt(time, 10);
return time < 10 ? "0" + time : time;
}
-
+ return toTime(pos);
}
}
+
+
//
------------------------------------------------------------------------------------------------
// Prototypes of several players
//
------------------------------------------------------------------------------------------------
@@ -425,7 +462,8 @@
if (this.controls == undefined) this.controls = false;
this.width = $(this.player).attr('width') > 0 ?
$(this.player).attr('width') : 320;
this.height = $(this.player).attr('height') > 0 ?
$(this.player).attr('height') : 240;;
- this.duration = $("head meta[name=media-duration]").attr("content"); //
not a mediatag attr.
+ //this.duration = $("head meta[name=media-duration]").attr("content"); //
not a mediatag attr.
+ this.duration = $(el).find("span.duration").text(); // not a mediatag attr.
this.state = 'init';
this.pos = 0;
@@ -441,12 +479,21 @@
this.url = url;
var self = this;
var timer = $(el).next('ul.controls li.position');
+ var slider = $(el).next('ul.controls li.slider > div');
this.player.addEventListener("playing",
- function(ev) {
- self.state = 'play';
- $.oiplayer.follow(self, timer);
- },
- false);
+ function(ev) {
+ self.state = 'play';
+ $.oiplayer.follow(self, timer, slider);
+ }, false);
+
+ this.player.addEventListener("durationchange",
+ function(ev) {
+ // console.log("dur: " + self.player.duration);
+ /* bug in FF? still NaN after durationchange */
+ if (!isNaN(self.player.duration) && self.player.duration > 0) {
+ self.duration = self.player.duration;
+ }
+ }, false);
return this.player;
}
MediaPlayer.prototype.play = function() {
@@ -476,7 +523,7 @@
MediaPlayer.prototype.seek = function(pos) {
this.player.currentTime = pos; // float
if (!this.player.paused) {
- this.player.play();
+ //this.player.play();
}
}
MediaPlayer.prototype.info = function() {
@@ -613,6 +660,13 @@
var flwplayer = config.server + config.flash;
var duration = (this.duration == undefined ? 0 :
Math.round(this.duration));
+ var ctrls;
+ if (this.controls) {
+ ctrls = { height: 24, autoHide: 'always', hideDelay: 2000, fullscreen:
false };
+ } else {
+ ctrls = null;
+ }
+
var div = document.createElement('div'); // TODO: add (random) id: adding
flowplayer and returning it impossible without id
$(el).closest('div.oiplayer').html(div);
$(div).addClass('player');
@@ -625,7 +679,7 @@
autoBuffering: this.autobuffer,
bufferLength: 5
},
- plugins: { controls: { height: 24, autoHide: 'always', hideDelay:
2000, fullscreen: false } }
+ plugins: { controls: ctrls }
});
return this.player;
}
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs