/****************************************************************************
* 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:'FFFFCC',
              frontcolor:'000000',
              lightcolor:'000000',
              screencolor:'000000',
              width:'320',
              logo:'',
              overstretch:'false',
              shownavigation:'true',
              showstop:'true',
              showdigits:'true',
              usefullscreen:'true',
              usemute:'false',
              autostart:'false',
              bufferlength:'3',
              duration:'0',
              repeat:'false',
              sender:'',
              start:'0',
              volume:'50',
              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;
}
