cacert-testmgr/external/ZendFramework-1.9.5/externals/dojo/dojox/av/widget/ProgressSlider.js

133 lines
3.8 KiB
JavaScript
Raw Permalink Normal View History

dojo.provide("dojox.av.widget.ProgressSlider");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.declare("dojox.av.widget.ProgressSlider", [dijit._Widget, dijit._Templated], {
// summary:
// A custom slider widget to use with dojox.av.widget.Player.
// description:
// Displays the current playhead position of the media. Has two
// progress bars: one for playhead position, and one for download
// progress.
//
templatePath: dojo.moduleUrl("dojox.av.widget","resources/ProgressSlider.html"),
postCreate: function(){
// summary:
// Initialize slider.
//
this.seeking = false;
this.handleWidth = dojo.marginBox(this.handle).w;
var dim = dojo.coords(this.domNode);
this.finalWidth = dim.w
this.width = dim.w-this.handleWidth;
this.x = dim.x;
dojo.setSelectable(this.domNode, false);
dojo.setSelectable(this.handle, false);
},
setMedia: function(/* Object */med, playerWidget){
// summary:
// A common method to set the media in all Player widgets.
// May do connections and initializations.
//
this.playerWidget = playerWidget;
this.media = med;
dojo.connect(this.media, "onMetaData", this, function(data){
if(data && data.duration){
this.duration = data.duration;
}
});
dojo.connect(this.media, "onEnd", this, function(){
dojo.disconnect(this.posCon);
this.setHandle(this.duration);
});
dojo.connect(this.media, "onStart", this, function(){
this.posCon = dojo.connect(this.media, "onPosition", this, "setHandle");
});
dojo.connect(this.media, "onDownloaded", this, function(percent){
this.setLoadedPosition(percent*.01);
this.width = this.finalWidth * .01 * percent;
});
},
onDrag: function(/* HTMLEvent */ evt){
// summary:
// Fired when the mouse is moved. Sets the slider.
//
var x = evt.clientX - this.x;
if(x<0) x = 0;
if(x>this.width-this.handleWidth) x=this.width-this.handleWidth;
var p = x/this.finalWidth;
this.media.seek( this.duration * p );
dojo.style(this.handle, "marginLeft", x+"px");
dojo.style(this.progressPosition, "width", x+"px");
},
startDrag: function(){
// summary:
// Fired onmousedown of the slider handle.
//
dojo.setSelectable(this.playerWidget.domNode, false);
this.seeking = true;
this.cmove = dojo.connect(dojo.doc, "mousemove", this, "onDrag");
this.cup = dojo.connect(dojo.doc, "mouseup", this, "endDrag");
},
endDrag: function(){
// summary:
// Fired on document.onmouseup.
//
dojo.setSelectable(this.playerWidget.domNode, true);
this.seeking = false;
if(this.cmove) dojo.disconnect(this.cmove);
if(this.cup) dojo.disconnect(this.cup);
this.handleOut();
},
setHandle: function(time){
// summary:
// Sets the slider handle (when it is not being dragged)
//
if(!this.seeking){
var w = this.width-this.handleWidth;
var p = time/this.duration;
var x = p*w;
dojo.style(this.handle, "marginLeft", x+"px");
dojo.style(this.progressPosition, "width", x+"px");
}
},
setLoadedPosition: function(decimal){
// summary:
// Sets the download progress bar to the percentage of how much
// the media has been downloaded.
dojo.style(this.progressLoaded, "width", (this.finalWidth*decimal)+"px");
},
handleOver: function(){
// summary:
// Highlights the slider handle on mouseover, and
// stays highlighted during drag.
//
dojo.addClass(this.handle, "over");
},
handleOut: function(){
// summary:
// Unhighlights handle onmouseover, or on endDrag.
//
if(!this.seeking){
dojo.removeClass(this.handle, "over");
}
},
onResize: function(playerDimensions){
// summary:
// Handles player resize. Need to recalculate the width of
// position an download bars.
var dim = dojo.coords(this.domNode);
this.finalWidth = dim.w;
}
});