summaryrefslogtreecommitdiff
path: root/modules/JWplayer/wmvplayer.js
diff options
context:
space:
mode:
Diffstat (limited to 'modules/JWplayer/wmvplayer.js')
-rw-r--r--modules/JWplayer/wmvplayer.js799
1 files changed, 799 insertions, 0 deletions
diff --git a/modules/JWplayer/wmvplayer.js b/modules/JWplayer/wmvplayer.js
new file mode 100644
index 0000000000..75fb965787
--- /dev/null
+++ b/modules/JWplayer/wmvplayer.js
@@ -0,0 +1,799 @@
+/* wmvplayer.js - PhpGedView Author Brian Holland
+ * @package webtrees
+ * @subpackage Module
+ * @version $Id$
+*/
+/****************************************************************************
+* JW WMV Player version 1.1, created with M$ Silverlight 1.0
+*
+* This file contains all logic for the JW WMV Player. For a functional setup,
+* the following two files are also needed:
+* - silverlight.js (for instantiating the silverlight plugin)
+* - wmvplayer.xaml (or another XAML skin describing the player graphics)
+*
+* More info: http://www.jeroenwijering.com/?item=JW_WMV_Player
+****************************************************************************/
+if(typeof jeroenwijering == "undefined") {
+ var jeroenwijering = new Object();
+ jeroenwijering.utils = new Object();
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+* The player wrapper; loads config variables and starts MVC cycle.
+****************************************************************************/
+jeroenwijering.Player = function(cnt,src,cfg) {
+ this.controller;
+ this.model;
+ this.view;
+ this.configuration = {
+ backgroundcolor:'FFFFFF',
+ windowless:'false',
+ file:'',
+ height:'260',
+ image:'',
+ backcolor:'FFFFFF',
+ frontcolor:'000000',
+ lightcolor:'000000',
+ screencolor:'000000',
+ width:'320',
+ logo:'',
+ overstretch:'false',
+ shownavigation:'true',
+ showstop:'false',
+ showdigits:'true',
+ usefullscreen:'true',
+ usemute:'false',
+ autostart:'false',
+ bufferlength:'3',
+ duration:'0',
+ repeat:'false',
+ sender:'',
+ start:'0',
+ volume:'90',
+ link:'',
+ linkfromdisplay:'false',
+ linktarget:'_self'
+ };
+ for(itm in this.configuration) {
+ if(cfg[itm] != undefined) {
+ if (itm.indexOf('color') > 0) {
+ this.configuration[itm] = cfg[itm].substr(cfg[itm].length-6);
+ } else {
+ this.configuration[itm] = cfg[itm];
+ }
+ }
+ }
+ Silverlight.createObjectEx({
+ source:src,
+ parentElement:cnt,
+ properties:{
+ width:this.configuration['width'],
+ height:this.configuration['height'],
+ version:'1.0',
+ inplaceInstallPrompt:true,
+ isWindowless:this.configuration['windowless'],
+ background:'#'+this.configuration['backgroundcolor']
+ },
+ events:{
+ onLoad:this.onLoadHandler,
+ onError:null
+ },
+ context:this
+ });
+}
+
+jeroenwijering.Player.prototype = {
+ addListener: function(typ,fcn) {
+ this.view.listeners.push({type:typ,func:fcn});
+ },
+
+ getConfig: function() {
+ return this.configuration;
+ },
+
+ onLoadHandler: function(pid,tgt,sdr) {
+ tgt.configuration['sender'] = sdr;
+ tgt.controller = new jeroenwijering.Controller(tgt.configuration);
+ tgt.view = new jeroenwijering.View(tgt.configuration,tgt.controller);
+ tgt.model = new jeroenwijering.Model(tgt.configuration,tgt.controller,tgt.view);
+ tgt.controller.startMVC(tgt.view,tgt.model);
+ },
+
+ sendEvent: function(typ,prm) {
+ switch(typ.toUpperCase()) {
+ case 'LINK':
+ this.controller.setLink();
+ break;
+ case 'LOAD':
+ this.controller.setLoad(prm);
+ break;
+ case 'MUTE':
+ this.controller.setMute();
+ break;
+ case 'PLAY':
+ this.controller.setPlay();
+ break;
+ case 'SCRUB':
+ this.controller.setScrub(prm);
+ break;
+ case 'STOP':
+ this.controller.setStop();
+ break;
+ case 'VOLUME':
+ this.controller.setVolume(prm);
+ break;
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+* The controller of the player MVC triad, which processes all user input.
+****************************************************************************/
+jeroenwijering.Controller = function(cfg) {
+ this.configuration = cfg;
+}
+
+jeroenwijering.Controller.prototype = {
+ startMVC: function(vie,mdl) {
+ this.view = vie;
+ this.model = mdl;
+ if(this.configuration['usemute'] == 'true') {
+ this.view.onVolume(0);
+ this.view.onMute(true);
+ this.model.goVolume(0);
+ } else {
+ this.view.onVolume(this.configuration['volume']);
+ this.model.goVolume(this.configuration['volume']);
+ }
+ if(this.configuration['autostart'] == 'true') {
+ this.model.goStart();
+ } else {
+ this.model.goPause();
+ }
+ },
+
+ setState: function(old,stt) {
+ this.state = stt;
+ var pos = this.configuration['start'];
+ if(old == 'Closed' && pos > 0) {
+ setTimeout(jeroenwijering.utils.delegate(this,this.setScrub),200,pos);
+ }
+ },
+
+ setLink: function() {
+ if (this.configuration['linktarget'].indexOf('javascript:') == 0) {
+ return Function(this.configuration['linktarget']).apply();
+ } else if (this.configuration['linktarget'] == '_blank') {
+ window.open(this.configuration['link']);
+ } else if (this.configuration['linktarget'] != '') {
+ window.location = this.configuration['link'];
+ }
+ },
+
+ setLoad: function(fil) {
+ if(this.model.state != "Closed") {
+ this.model.goStop();
+ }
+ this.configuration['file'] = fil;
+ if(this.configuration['autostart'] == 'true') {
+ setTimeout(jeroenwijering.utils.delegate(this.model,this.model.goStart),100);
+ }
+ },
+
+ setMute: function() {
+ if(this.configuration['usemute'] == 'true') {
+ this.configuration['usemute'] = 'false';
+ this.model.goVolume(this.configuration['volume']);
+ this.view.onMute(false);
+ } else {
+ this.configuration['usemute'] = 'true';
+ this.model.goVolume(0);
+ this.view.onMute(true);
+ }
+ },
+
+ setPlay: function() {
+ if(this.state == 'Buffering' || this.state == 'Playing') {
+ if(this.configuration['duration'] == 0) {
+ this.model.goStop();
+ } else {
+ this.model.goPause();
+ }
+ } else {
+ this.model.goStart();
+ }
+ },
+
+ setScrub: function(sec) {
+ if(sec < 2) {
+ sec = 0;
+ } else if (sec > this.configuration['duration']-4) {
+ sec = this.configuration['duration']-4;
+ }
+ if(this.state == 'Buffering' || this.state == 'Playing') {
+ this.model.goStart(sec);
+ } else {
+ this.model.goPause(sec);
+ }
+ },
+
+ setStop: function() {
+ this.model.goStop();
+ },
+
+ setVolume: function(pct) {
+ if(pct < 0) { pct = 0; } else if(pct > 100) { pct = 100; }
+ this.configuration['volume'] = Math.round(pct);
+ this.model.goVolume(pct);
+ this.view.onVolume(pct);
+ if(this.configuration['usemute'] == 'true') {
+ this.configuration['usemute'] = 'false';
+ this.view.onMute(false);
+ }
+ },
+
+ setFullscreen: function() {
+ var fss = !this.configuration['sender'].getHost().content.FullScreen;
+ this.configuration['sender'].getHost().content.FullScreen = fss;
+ jeroenwijering.utils.delegate(this.view,this.view.onFullscreen);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+* The view of the player MVC triad, which manages the graphics.
+****************************************************************************/
+jeroenwijering.View = function(cfg,ctr) {
+ this.configuration = cfg;
+ this.listeners = Array();
+ this.controller = ctr;
+ this.fstimeout;
+ this.fslistener;
+ this.display = this.configuration['sender'].findName("PlayerDisplay");
+ this.controlbar = this.configuration['sender'].findName("PlayerControls");
+ this.configuration['sender'].getHost().content.onResize =
+ jeroenwijering.utils.delegate(this,this.resizePlayer);
+ this.configuration['sender'].getHost().content.onFullScreenChange =
+ jeroenwijering.utils.delegate(this,this.onFullscreen);
+ this.assignColorsClicks();
+ this.resizePlayer();
+}
+
+jeroenwijering.View.prototype = {
+ onBuffer: function(pct) {
+ var snd = this.configuration['sender'];
+ if(pct == 0) {
+ snd.findName("BufferText").Text = null;
+ } else {
+ pct < 10 ? pct = "0"+pct: pct = ""+pct;
+ snd.findName("BufferText").Text = pct;
+ }
+ this.delegate('BUFFER',[pct]);
+ },
+
+ onFullscreen: function(fss) {
+ var snd = this.configuration['sender'];
+ var fst = snd.getHost().content.FullScreen;
+ if(fst) {
+ this.fstimeout = setTimeout(jeroenwijering.utils.delegate(this,
+ this.hideFSControls),2000);
+ this.fslistener = this.display.addEventListener('MouseMove',
+ jeroenwijering.utils.delegate(this,this.showFSControls));
+ snd.findName("FullscreenSymbol").Visibility = "Collapsed";
+ snd.findName("FullscreenOffSymbol").Visibility = "Visible";
+ } else {
+ clearTimeout(this.fstimeout);
+ this.display.removeEventListener("MouseMove",this.fslistener);
+ this.controlbar.Visibility = "Visible";
+ this.display.Cursor = "Hand";
+ snd.findName("FullscreenSymbol").Visibility = "Visible";
+ snd.findName("FullscreenOffSymbol").Visibility = "Collapsed";
+ }
+ this.resizePlayer();
+ this.delegate('FULLSCREEN');
+ },
+
+ showFSControls: function(sdr,arg) {
+ var vbt = sdr.findName('PlayerControls');
+ var yps = arg.GetPosition(vbt).Y;
+ clearTimeout(this.fstimeout);
+ this.controlbar.Visibility = "Visible";
+ this.display.Cursor = "Hand";
+ if(yps < 0) {
+ this.fstimeout = setTimeout(jeroenwijering.utils.delegate(this,
+ this.hideFSControls),2000);
+ }
+ },
+
+ hideFSControls: function() {
+ this.controlbar.Visibility = "Collapsed";
+ this.display.Cursor = "None";
+ },
+
+ onLoad: function(pct) {
+ var snd = this.configuration['sender'];
+ var max = snd.findName("TimeSlider").Width;
+ snd.findName("DownloadProgress").Width = Math.round(max*pct/100);
+ this.delegate('LOAD',[pct]);
+ },
+
+ onMute: function(mut) {
+ var snd = this.configuration['sender'];
+ this.configuration['usemute'] = ''+mut;
+ if(mut) {
+ snd.findName("VolumeHighlight").Visibility = "Collapsed";
+ snd.findName("MuteSymbol").Visibility = "Visible";
+ snd.findName("MuteOffSymbol").Visibility = "Collapsed";
+ if(this.state == 'Playing') {
+ snd.findName("MuteIcon").Visibility = "Visible";
+ }
+ } else {
+ snd.findName("VolumeHighlight").Visibility = "Visible";
+ snd.findName("MuteSymbol").Visibility = "Collapsed";
+ snd.findName("MuteOffSymbol").Visibility = "Visible";
+ snd.findName("MuteIcon").Visibility = "Collapsed";
+ }
+ this.delegate('MUTE');
+ },
+
+ onState: function(old,stt) {
+ var snd = this.configuration['sender'];
+ this.state = stt;
+ if(stt == 'Buffering' || stt == 'Playing' || stt == 'Opening') {
+ snd.findName("PlayIcon").Visibility = "Collapsed";
+ snd.findName("PlaySymbol").Visibility = "Collapsed";
+ snd.findName("PlayOffSymbol").Visibility = "Visible";
+ if (stt=='Playing') {
+ snd.findName("BufferIcon").Visibility = "Collapsed";
+ snd.findName("BufferText").Visibility = "Collapsed";
+ if(this.configuration['usemute'] == 'true') {
+ snd.findName("MuteIcon").Visibility = "Visible";
+ }
+ } else{
+ snd.findName("BufferIcon").Visibility = "Visible";
+ snd.findName("BufferText").Visibility = "Visible";
+ }
+ } else {
+ snd.findName("MuteIcon").Visibility = "Collapsed";
+ snd.findName("BufferIcon").Visibility = "Collapsed";
+ snd.findName("BufferText").Visibility = "Collapsed";
+ snd.findName("PlayOffSymbol").Visibility = "Collapsed";
+ snd.findName("PlaySymbol").Visibility = "Visible";
+ if(this.configuration['linkfromdisplay'] == 'true') {
+ snd.findName("PlayIcon").Visibility = "Collapsed";
+ } else {
+ snd.findName("PlayIcon").Visibility = "Visible";
+ }
+ }
+ try {
+ if(!(old == 'Completed' && stt == 'Buffering') &&
+ !(old == 'Buffering' && stt == 'Paused')) {
+ playerStatusChange(old.toUpperCase(),stt.toUpperCase());
+ }
+ } catch (err) {}
+ this.delegate('STATE',[old,stt]);
+ },
+
+ onTime: function(elp,dur) {
+ var snd = this.configuration['sender'];
+ var snd = this.configuration['sender'];
+ var max = snd.findName("TimeSlider").Width;
+ if(dur > 0) {
+ var pos = Math.round(max*elp/dur);
+ this.configuration['duration'] = dur;
+ snd.findName("ElapsedText").Text = jeroenwijering.utils.timestring(elp);
+ snd.findName("RemainingText").Text = jeroenwijering.utils.timestring(dur-elp);
+ snd.findName("TimeSymbol").Visibility = "Visible";
+ snd.findName("TimeSymbol")['Canvas.Left'] = pos+4;
+ snd.findName("TimeHighlight").Width = pos-2;
+ } else {
+ snd.findName("TimeSymbol").Visibility = "Collapsed";
+ }
+ this.delegate('TIME',[elp,dur]);
+ },
+
+ onVolume: function(pct) {
+ var snd = this.configuration['sender'];
+ snd.findName("VolumeHighlight").Width = Math.round(pct/5);
+ this.delegate('VOLUME',[pct]);
+ },
+
+ assignColorsClicks: function() {
+ this.display.Cursor = "Hand";
+ this.display.Background = "#FF"+this.configuration['screencolor'];
+ if(this.configuration['linkfromdisplay'] == 'false') {
+ this.display.addEventListener('MouseLeftButtonUp',
+ jeroenwijering.utils.delegate(this.controller,
+ this.controller.setPlay));
+ } else {
+ this.display.addEventListener('MouseLeftButtonUp',
+ jeroenwijering.utils.delegate(this.controller,
+ this.controller.setLink));
+ this.display.findName("PlayIcon").Visibility = "Collapsed";
+ }
+ if(this.configuration['logo'] != '') {
+ this.display.findName('OverlayCanvas').Visibility = "Visible";
+ this.display.findName('OverlayLogo').ImageSource =
+ this.configuration['logo'];
+ }
+ this.controlbar.findName("ControlbarBack").Fill =
+ "#FF"+this.configuration['backcolor'];
+ this.assignButton('Play',this.controller.setPlay);
+ this.assignButton('Stop',this.controller.setStop);
+ this.configuration['sender'].findName('ElapsedText').Foreground =
+ "#FF"+this.configuration['frontcolor'];
+ this.assignSlider('Time',this.changeTime);
+ this.configuration['sender'].findName('DownloadProgress').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ this.configuration['sender'].findName('RemainingText').Foreground =
+ "#FF"+this.configuration['frontcolor'];
+ this.assignButton('Link',this.controller.setLink);
+ this.assignButton('Fullscreen',this.controller.setFullscreen);
+ this.assignButton('Mute',this.controller.setMute);
+ this.assignSlider('Volume',this.changeVolume);
+ },
+
+ assignButton: function(btn,act) {
+ var el1 = this.configuration['sender'].findName(btn+'Button');
+ el1.Cursor = "Hand";
+ el1.addEventListener('MouseLeftButtonUp',
+ jeroenwijering.utils.delegate(this.controller,act));
+ el1.addEventListener('MouseEnter',
+ jeroenwijering.utils.delegate(this,this.rollOver));
+ el1.addEventListener('MouseLeave',
+ jeroenwijering.utils.delegate(this,this.rollOut));
+ this.configuration['sender'].findName(btn+'Symbol').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ try {
+ this.configuration['sender'].findName(btn+'OffSymbol').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ } catch(e) {}
+ },
+
+ assignSlider: function(sld,act) {
+ var el1 = this.configuration['sender'].findName(sld+'Button');
+ el1.Cursor = "Hand";
+ el1.addEventListener('MouseLeftButtonUp',
+ jeroenwijering.utils.delegate(this,act));
+ el1.addEventListener('MouseEnter',
+ jeroenwijering.utils.delegate(this,this.rollOver));
+ el1.addEventListener('MouseLeave',
+ jeroenwijering.utils.delegate(this,this.rollOut));
+ this.configuration['sender'].findName(sld+'Slider').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ this.configuration['sender'].findName(sld+'Highlight').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ this.configuration['sender'].findName(sld+'Symbol').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ },
+
+ delegate: function(typ,arg) {
+ for(var i=0; i<this.listeners.length; i++) {
+ if(this.listeners[i]['type'].toUpperCase() == typ) {
+ this.listeners[i]['func'].apply(null,arg);
+ }
+ }
+ },
+
+ rollOver: function(sdr) {
+ var str = sdr.Name.substr(0,sdr.Name.length-6);
+ this.configuration['sender'].findName(str+'Symbol').Fill =
+ "#FF"+this.configuration['lightcolor'];
+ try {
+ this.configuration['sender'].findName(str+'OffSymbol').Fill =
+ "#FF"+this.configuration['lightcolor'];
+ } catch(e) {}
+ },
+
+ rollOut: function(sdr) {
+ var str = sdr.Name.substr(0,sdr.Name.length-6);
+ this.configuration['sender'].findName(str+'Symbol').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ try {
+ this.configuration['sender'].findName(str+'OffSymbol').Fill =
+ "#FF"+this.configuration['frontcolor'];
+ } catch(e) {}
+ },
+
+ changeTime: function(sdr,arg) {
+ var tbt = sdr.findName('TimeSlider');
+ var xps = arg.GetPosition(tbt).X;
+ var sec = Math.floor(xps/tbt.Width*this.configuration['duration']);
+ this.controller.setScrub(sec);
+ },
+
+ changeVolume: function(sdr,arg) {
+ var vbt = sdr.findName('VolumeButton');
+ var xps = arg.GetPosition(vbt).X;
+ this.controller.setVolume(xps*5);
+ },
+
+ resizePlayer: function() {
+ var wid = this.configuration['sender'].getHost().content.actualWidth;
+ var hei = this.configuration['sender'].getHost().content.actualHeight;
+ var fss = this.configuration['sender'].getHost().content.FullScreen;
+ if(this.configuration['shownavigation'] == 'true') {
+ if(fss == true) {
+ this.resizeDisplay(wid,hei);
+ this.controlbar['Canvas.Left'] = Math.round(wid/2-250);
+ this.resizeControlbar(500,hei-this.controlbar.Height-16);
+ this.controlbar.findName('ControlbarBack')['Opacity'] = 0.5;
+ } else {
+ this.resizeDisplay(wid,hei-20);
+ this.controlbar['Canvas.Left'] = 0;
+ this.resizeControlbar(wid,hei-this.controlbar.Height);
+ this.controlbar.findName('ControlbarBack')['Opacity'] = 1;
+ }
+ } else {
+ this.resizeDisplay(wid,hei);
+ }
+ },
+
+ resizeDisplay: function(wid,hei) {
+ this.stretchElement('PlayerDisplay',wid,hei);
+ this.stretchElement('VideoWindow',wid,hei);
+ this.stretchElement('PlaceholderImage',wid,hei);
+ this.centerElement('PlayIcon',wid,hei);
+ this.centerElement('MuteIcon',wid,hei);
+ this.centerElement('BufferIcon',wid,hei);
+ this.centerElement('BufferText',wid,hei);
+ this.display.findName('OverlayCanvas')['Canvas.Left'] = wid -
+ this.display.findName('OverlayCanvas').Width - 10;
+ this.display.Visibility = "Visible";
+ },
+
+ resizeControlbar: function(wid,yps,alp) {
+ this.controlbar['Canvas.Top'] = yps;
+ this.stretchElement('PlayerControls',wid);
+ this.stretchElement('ControlbarBack',wid);
+ this.placeElement('PlayButton',0);
+ var lft = 17;
+ this.placeElement('VolumeButton',wid-24);
+ this.placeElement('MuteButton',wid-37);
+ var rgt = 37;
+ if(this.configuration['showstop'] == 'true') {
+ this.placeElement('StopButton',lft);
+ lft += 17;
+ } else {
+ this.controlbar.findName('StopButton').Visibility="Collapsed";
+ }
+ if(this.configuration['usefullscreen'] == 'true') {
+ rgt += 18;
+ this.placeElement('FullscreenButton',wid-rgt);
+ } else {
+ this.controlbar.findName('FullscreenButton').Visibility =
+ "Collapsed";
+ }
+ if(this.configuration['link'] != '') {
+ rgt += 18;
+ this.placeElement('LinkButton',wid-rgt);
+ } else {
+ this.controlbar.findName('LinkButton').Visibility="Collapsed";
+ }
+ if(this.configuration['showdigits'] == 'true' && wid-rgt-lft> 160) {
+ rgt += 35;
+ this.controlbar.findName('RemainingButton').Visibility="Visible";
+ this.controlbar.findName('ElapsedButton').Visibility="Visible";
+ this.placeElement('RemainingButton',wid-rgt);
+ this.placeElement('ElapsedButton',lft);
+ lft +=35;
+ } else {
+ this.controlbar.findName('RemainingButton').Visibility =
+ "Collapsed";
+ this.controlbar.findName('ElapsedButton').Visibility="Collapsed";
+ }
+ this.placeElement('TimeButton',lft);
+ this.stretchElement('TimeButton',wid-lft-rgt);
+ this.stretchElement('TimeShadow',wid-lft-rgt);
+ this.stretchElement('TimeStroke',wid-lft-rgt);
+ this.stretchElement('TimeFill',wid-lft-rgt);
+ this.stretchElement('TimeSlider',wid-lft-rgt-10);
+ this.stretchElement('DownloadProgress',wid-lft-rgt-10);
+ var tsb = this.configuration['sender'].findName('TimeSymbol');
+ this.stretchElement('TimeHighlight',tsb['Canvas.Left']-5);
+ this.controlbar.Visibility = "Visible";
+ },
+
+ centerElement: function(nam,wid,hei) {
+ var elm = this.configuration['sender'].findName(nam);
+ elm['Canvas.Left'] = Math.round(wid/2 - elm.Width/2);
+ elm['Canvas.Top'] = Math.round(hei/2 - elm.Height/2);
+ },
+
+ stretchElement: function(nam,wid,hei) {
+ var elm = this.configuration['sender'].findName(nam);
+ elm.Width = wid;
+ if (hei != undefined) { elm.Height = hei; }
+ },
+
+ placeElement: function(nam,xps,yps) {
+ var elm = this.configuration['sender'].findName(nam);
+ elm['Canvas.Left'] = xps;
+ if(yps) { elm['Canvas.Top'] = yps; }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+* The model of the player MVC triad, which stores all playback logic.
+****************************************************************************/
+jeroenwijering.Model = function(cfg,ctr,vie) {
+ this.configuration = cfg;
+ this.controller = ctr;
+ this.view = vie;
+ this.video = this.configuration['sender'].findName("VideoWindow");
+ this.preview = this.configuration['sender'].findName("PlaceholderImage");
+ var str = {
+ 'true':'UniformToFill',
+ 'false':'Uniform',
+ 'fit':'Fill',
+ 'none':'None'
+ }
+ this.state = this.video.CurrentState;
+ this.timeint;
+ this.video.Stretch = str[this.configuration['overstretch']];
+ this.preview.Stretch = str[this.configuration['overstretch']];
+ this.video.BufferingTime =
+ jeroenwijering.utils.spanstring(this.configuration['bufferlength']);
+ this.video.AutoPlay = true;
+ this.video.AddEventListener("CurrentStateChanged",
+ jeroenwijering.utils.delegate(this,this.stateChanged));
+ this.video.AddEventListener("MediaEnded",
+ jeroenwijering.utils.delegate(this,this.mediaEnded));
+ this.video.AddEventListener("BufferingProgressChanged",
+ jeroenwijering.utils.delegate(this,this.bufferChanged));
+ this.video.AddEventListener("DownloadProgressChanged",
+ jeroenwijering.utils.delegate(this,this.downloadChanged));
+ if(this.configuration['image'] != '') {
+ this.preview.Source = this.configuration['image'];
+ }
+}
+
+jeroenwijering.Model.prototype = {
+ goPause: function(sec) {
+ this.video.pause();
+ if(!isNaN(sec)) {
+ this.video.Position = jeroenwijering.utils.spanstring(sec);
+ }
+ this.timeChanged();
+ },
+
+ goStart: function(sec) {
+ this.video.Visibility = 'Visible';
+ this.preview.Visibility = 'Collapsed';
+ if(this.state == "Closed") {
+ this.video.Source = this.configuration['file'];
+ } else {
+ this.video.play();
+ }
+ if(!isNaN(sec)) {
+ this.video.Position = jeroenwijering.utils.spanstring(sec);
+ }
+ },
+
+ goStop: function() {
+ this.video.Visibility = 'Collapsed';
+ this.preview.Visibility = 'Visible';
+ this.goPause(0);
+ this.video.Source = 'null';
+ this.view.onBuffer(0);
+ clearInterval(this.timeint);
+ },
+
+ goVolume: function(pct) {
+ this.video.Volume = pct/100;
+ },
+
+ stateChanged: function() {
+ var stt = this.video.CurrentState;
+ if(stt != this.state) {
+ this.controller.setState(this.state,stt);
+ this.view.onState(this.state,stt);
+ this.state = stt;
+ this.configuration['duration'] =
+ Math.round(this.video.NaturalDuration.Seconds*10)/10;
+ if(stt != "Playing" && stt != "Buffering" && stt != "Opening") {
+ clearInterval(this.timeint);
+ } else {
+ this.timeint = setInterval(jeroenwijering.utils.delegate(
+ this,this.timeChanged),100);
+ }
+ }
+ },
+
+ mediaEnded: function() {
+ if(this.configuration['repeat'] == 'true') {
+ this.goStart(0);
+ } else {
+ this.state = 'Completed';
+ this.view.onState(this.state,'Completed');
+ this.video.Visibility = 'Collapsed';
+ this.preview.Visibility = 'Visible';
+ this.goPause(0);
+ }
+ },
+
+ bufferChanged: function() {
+ var bfr = Math.round(this.video.BufferingProgress*100);
+ this.view.onBuffer(bfr);
+ },
+
+ downloadChanged: function() {
+ var dld = Math.round(this.video.DownloadProgress*100);
+ this.view.onLoad(dld);
+ },
+
+ timeChanged: function() {
+ var pos = Math.round(this.video.Position.Seconds*10)/10;
+ this.view.onTime(pos,this.configuration['duration']);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+* Some utility functions.
+****************************************************************************/
+jeroenwijering.utils.delegate = function(obj,fcn) {
+ return function() {
+ return fcn.apply(obj,arguments);
+ }
+}
+jeroenwijering.utils.timestring = function(stp) {
+ var hrs = Math.floor(stp/3600);
+ var min = Math.floor(stp%3600/60);
+ var sec = Math.round(stp%60);
+ var str = "";
+ sec > 9 ? str += sec: str +='0'+sec;
+ min > 9 ? str = min+":"+str: str='0'+min+":"+str;
+ hrs > 0 ? str = hrs+":"+str: null;
+ return str;
+}
+jeroenwijering.utils.spanstring = function(stp) {
+ var hrs = Math.floor(stp/3600);
+ var min = Math.floor(stp%3600/60);
+ var sec = Math.round(stp%60*10)/10;
+ var str = hrs+':'+min+':'+sec;
+ return str;
+} \ No newline at end of file