silverlight_player_helper 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,794 @@
1
+ /****************************************************************************
2
+ * JW WMV Player version 1.1, created with M$ Silverlight 1.0
3
+ *
4
+ * This file contains all logic for the JW WMV Player. For a functional setup,
5
+ * the following two files are also needed:
6
+ * - silverlight.js (for instantiating the silverlight plugin)
7
+ * - wmvplayer.xaml (or another XAML skin describing the player graphics)
8
+ *
9
+ * More info: http://www.jeroenwijering.com/?item=JW_WMV_Player
10
+ ****************************************************************************/
11
+ if(typeof jeroenwijering == "undefined") {
12
+ var jeroenwijering = new Object();
13
+ jeroenwijering.utils = new Object();
14
+ }
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+ /****************************************************************************
26
+ * The player wrapper; loads config variables and starts MVC cycle.
27
+ ****************************************************************************/
28
+ jeroenwijering.Player = function(cnt,src,cfg) {
29
+ this.controller;
30
+ this.model;
31
+ this.view;
32
+ this.configuration = {
33
+ backgroundcolor:'FFFFFF',
34
+ windowless:'false',
35
+ file:'',
36
+ height:'260',
37
+ image:'',
38
+ backcolor:'FFFFFF',
39
+ frontcolor:'000000',
40
+ lightcolor:'000000',
41
+ screencolor:'000000',
42
+ width:'320',
43
+ logo:'',
44
+ overstretch:'false',
45
+ shownavigation:'true',
46
+ showstop:'false',
47
+ showdigits:'true',
48
+ usefullscreen:'true',
49
+ usemute:'false',
50
+ autostart:'false',
51
+ bufferlength:'3',
52
+ duration:'0',
53
+ repeat:'false',
54
+ sender:'',
55
+ start:'0',
56
+ volume:'90',
57
+ link:'',
58
+ linkfromdisplay:'false',
59
+ linktarget:'_self'
60
+ };
61
+ for(itm in this.configuration) {
62
+ if(cfg[itm] != undefined) {
63
+ if (itm.indexOf('color') > 0) {
64
+ this.configuration[itm] = cfg[itm].substr(cfg[itm].length-6);
65
+ } else {
66
+ this.configuration[itm] = cfg[itm];
67
+ }
68
+ }
69
+ }
70
+ Silverlight.createObjectEx({
71
+ source:src,
72
+ parentElement:cnt,
73
+ properties:{
74
+ width:this.configuration['width'],
75
+ height:this.configuration['height'],
76
+ version:'1.0',
77
+ inplaceInstallPrompt:true,
78
+ isWindowless:this.configuration['windowless'],
79
+ background:'#'+this.configuration['backgroundcolor']
80
+ },
81
+ events:{
82
+ onLoad:this.onLoadHandler,
83
+ onError:null
84
+ },
85
+ context:this
86
+ });
87
+ }
88
+
89
+ jeroenwijering.Player.prototype = {
90
+ addListener: function(typ,fcn) {
91
+ this.view.listeners.push({type:typ,func:fcn});
92
+ },
93
+
94
+ getConfig: function() {
95
+ return this.configuration;
96
+ },
97
+
98
+ onLoadHandler: function(pid,tgt,sdr) {
99
+ tgt.configuration['sender'] = sdr;
100
+ tgt.controller = new jeroenwijering.Controller(tgt.configuration);
101
+ tgt.view = new jeroenwijering.View(tgt.configuration,tgt.controller);
102
+ tgt.model = new jeroenwijering.Model(tgt.configuration,tgt.controller,tgt.view);
103
+ tgt.controller.startMVC(tgt.view,tgt.model);
104
+ },
105
+
106
+ sendEvent: function(typ,prm) {
107
+ switch(typ.toUpperCase()) {
108
+ case 'LINK':
109
+ this.controller.setLink();
110
+ break;
111
+ case 'LOAD':
112
+ this.controller.setLoad(prm);
113
+ break;
114
+ case 'MUTE':
115
+ this.controller.setMute();
116
+ break;
117
+ case 'PLAY':
118
+ this.controller.setPlay();
119
+ break;
120
+ case 'SCRUB':
121
+ this.controller.setScrub(prm);
122
+ break;
123
+ case 'STOP':
124
+ this.controller.setStop();
125
+ break;
126
+ case 'VOLUME':
127
+ this.controller.setVolume(prm);
128
+ break;
129
+ }
130
+ }
131
+ }
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+ /****************************************************************************
143
+ * The controller of the player MVC triad, which processes all user input.
144
+ ****************************************************************************/
145
+ jeroenwijering.Controller = function(cfg) {
146
+ this.configuration = cfg;
147
+ }
148
+
149
+ jeroenwijering.Controller.prototype = {
150
+ startMVC: function(vie,mdl) {
151
+ this.view = vie;
152
+ this.model = mdl;
153
+ if(this.configuration['usemute'] == 'true') {
154
+ this.view.onVolume(0);
155
+ this.view.onMute(true);
156
+ this.model.goVolume(0);
157
+ } else {
158
+ this.view.onVolume(this.configuration['volume']);
159
+ this.model.goVolume(this.configuration['volume']);
160
+ }
161
+ if(this.configuration['autostart'] == 'true') {
162
+ this.model.goStart();
163
+ } else {
164
+ this.model.goPause();
165
+ }
166
+ },
167
+
168
+ setState: function(old,stt) {
169
+ this.state = stt;
170
+ var pos = this.configuration['start'];
171
+ if(old == 'Closed' && pos > 0) {
172
+ setTimeout(jeroenwijering.utils.delegate(this,this.setScrub),200,pos);
173
+ }
174
+ },
175
+
176
+ setLink: function() {
177
+ if (this.configuration['linktarget'].indexOf('javascript:') == 0) {
178
+ return Function(this.configuration['linktarget']).apply();
179
+ } else if (this.configuration['linktarget'] == '_blank') {
180
+ window.open(this.configuration['link']);
181
+ } else if (this.configuration['linktarget'] != '') {
182
+ window.location = this.configuration['link'];
183
+ }
184
+ },
185
+
186
+ setLoad: function(fil) {
187
+ if(this.model.state != "Closed") {
188
+ this.model.goStop();
189
+ }
190
+ this.configuration['file'] = fil;
191
+ if(this.configuration['autostart'] == 'true') {
192
+ setTimeout(jeroenwijering.utils.delegate(this.model,this.model.goStart),100);
193
+ }
194
+ },
195
+
196
+ setMute: function() {
197
+ if(this.configuration['usemute'] == 'true') {
198
+ this.configuration['usemute'] = 'false';
199
+ this.model.goVolume(this.configuration['volume']);
200
+ this.view.onMute(false);
201
+ } else {
202
+ this.configuration['usemute'] = 'true';
203
+ this.model.goVolume(0);
204
+ this.view.onMute(true);
205
+ }
206
+ },
207
+
208
+ setPlay: function() {
209
+ if(this.state == 'Buffering' || this.state == 'Playing') {
210
+ if(this.configuration['duration'] == 0) {
211
+ this.model.goStop();
212
+ } else {
213
+ this.model.goPause();
214
+ }
215
+ } else {
216
+ this.model.goStart();
217
+ }
218
+ },
219
+
220
+ setScrub: function(sec) {
221
+ if(sec < 2) {
222
+ sec = 0;
223
+ } else if (sec > this.configuration['duration']-4) {
224
+ sec = this.configuration['duration']-4;
225
+ }
226
+ if(this.state == 'Buffering' || this.state == 'Playing') {
227
+ this.model.goStart(sec);
228
+ } else {
229
+ this.model.goPause(sec);
230
+ }
231
+ },
232
+
233
+ setStop: function() {
234
+ this.model.goStop();
235
+ },
236
+
237
+ setVolume: function(pct) {
238
+ if(pct < 0) { pct = 0; } else if(pct > 100) { pct = 100; }
239
+ this.configuration['volume'] = Math.round(pct);
240
+ this.model.goVolume(pct);
241
+ this.view.onVolume(pct);
242
+ if(this.configuration['usemute'] == 'true') {
243
+ this.configuration['usemute'] = 'false';
244
+ this.view.onMute(false);
245
+ }
246
+ },
247
+
248
+ setFullscreen: function() {
249
+ var fss = !this.configuration['sender'].getHost().content.FullScreen;
250
+ this.configuration['sender'].getHost().content.FullScreen = fss;
251
+ jeroenwijering.utils.delegate(this.view,this.view.onFullscreen);
252
+ }
253
+ }
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+ /****************************************************************************
265
+ * The view of the player MVC triad, which manages the graphics.
266
+ ****************************************************************************/
267
+ jeroenwijering.View = function(cfg,ctr) {
268
+ this.configuration = cfg;
269
+ this.listeners = Array();
270
+ this.controller = ctr;
271
+ this.fstimeout;
272
+ this.fslistener;
273
+ this.display = this.configuration['sender'].findName("PlayerDisplay");
274
+ this.controlbar = this.configuration['sender'].findName("PlayerControls");
275
+ this.configuration['sender'].getHost().content.onResize =
276
+ jeroenwijering.utils.delegate(this,this.resizePlayer);
277
+ this.configuration['sender'].getHost().content.onFullScreenChange =
278
+ jeroenwijering.utils.delegate(this,this.onFullscreen);
279
+ this.assignColorsClicks();
280
+ this.resizePlayer();
281
+ }
282
+
283
+ jeroenwijering.View.prototype = {
284
+ onBuffer: function(pct) {
285
+ var snd = this.configuration['sender'];
286
+ if(pct == 0) {
287
+ snd.findName("BufferText").Text = null;
288
+ } else {
289
+ pct < 10 ? pct = "0"+pct: pct = ""+pct;
290
+ snd.findName("BufferText").Text = pct;
291
+ }
292
+ this.delegate('BUFFER',[pct]);
293
+ },
294
+
295
+ onFullscreen: function(fss) {
296
+ var snd = this.configuration['sender'];
297
+ var fst = snd.getHost().content.FullScreen;
298
+ if(fst) {
299
+ this.fstimeout = setTimeout(jeroenwijering.utils.delegate(this,
300
+ this.hideFSControls),2000);
301
+ this.fslistener = this.display.addEventListener('MouseMove',
302
+ jeroenwijering.utils.delegate(this,this.showFSControls));
303
+ snd.findName("FullscreenSymbol").Visibility = "Collapsed";
304
+ snd.findName("FullscreenOffSymbol").Visibility = "Visible";
305
+ } else {
306
+ clearTimeout(this.fstimeout);
307
+ this.display.removeEventListener("MouseMove",this.fslistener);
308
+ this.controlbar.Visibility = "Visible";
309
+ this.display.Cursor = "Hand";
310
+ snd.findName("FullscreenSymbol").Visibility = "Visible";
311
+ snd.findName("FullscreenOffSymbol").Visibility = "Collapsed";
312
+ }
313
+ this.resizePlayer();
314
+ this.delegate('FULLSCREEN');
315
+ },
316
+
317
+ showFSControls: function(sdr,arg) {
318
+ var vbt = sdr.findName('PlayerControls');
319
+ var yps = arg.GetPosition(vbt).Y;
320
+ clearTimeout(this.fstimeout);
321
+ this.controlbar.Visibility = "Visible";
322
+ this.display.Cursor = "Hand";
323
+ if(yps < 0) {
324
+ this.fstimeout = setTimeout(jeroenwijering.utils.delegate(this,
325
+ this.hideFSControls),2000);
326
+ }
327
+ },
328
+
329
+ hideFSControls: function() {
330
+ this.controlbar.Visibility = "Collapsed";
331
+ this.display.Cursor = "None";
332
+ },
333
+
334
+ onLoad: function(pct) {
335
+ var snd = this.configuration['sender'];
336
+ var max = snd.findName("TimeSlider").Width;
337
+ snd.findName("DownloadProgress").Width = Math.round(max*pct/100);
338
+ this.delegate('LOAD',[pct]);
339
+ },
340
+
341
+ onMute: function(mut) {
342
+ var snd = this.configuration['sender'];
343
+ this.configuration['usemute'] = ''+mut;
344
+ if(mut) {
345
+ snd.findName("VolumeHighlight").Visibility = "Collapsed";
346
+ snd.findName("MuteSymbol").Visibility = "Visible";
347
+ snd.findName("MuteOffSymbol").Visibility = "Collapsed";
348
+ if(this.state == 'Playing') {
349
+ snd.findName("MuteIcon").Visibility = "Visible";
350
+ }
351
+ } else {
352
+ snd.findName("VolumeHighlight").Visibility = "Visible";
353
+ snd.findName("MuteSymbol").Visibility = "Collapsed";
354
+ snd.findName("MuteOffSymbol").Visibility = "Visible";
355
+ snd.findName("MuteIcon").Visibility = "Collapsed";
356
+ }
357
+ this.delegate('MUTE');
358
+ },
359
+
360
+ onState: function(old,stt) {
361
+ var snd = this.configuration['sender'];
362
+ this.state = stt;
363
+ if(stt == 'Buffering' || stt == 'Playing' || stt == 'Opening') {
364
+ snd.findName("PlayIcon").Visibility = "Collapsed";
365
+ snd.findName("PlaySymbol").Visibility = "Collapsed";
366
+ snd.findName("PlayOffSymbol").Visibility = "Visible";
367
+ if (stt=='Playing') {
368
+ snd.findName("BufferIcon").Visibility = "Collapsed";
369
+ snd.findName("BufferText").Visibility = "Collapsed";
370
+ if(this.configuration['usemute'] == 'true') {
371
+ snd.findName("MuteIcon").Visibility = "Visible";
372
+ }
373
+ } else{
374
+ snd.findName("BufferIcon").Visibility = "Visible";
375
+ snd.findName("BufferText").Visibility = "Visible";
376
+ }
377
+ } else {
378
+ snd.findName("MuteIcon").Visibility = "Collapsed";
379
+ snd.findName("BufferIcon").Visibility = "Collapsed";
380
+ snd.findName("BufferText").Visibility = "Collapsed";
381
+ snd.findName("PlayOffSymbol").Visibility = "Collapsed";
382
+ snd.findName("PlaySymbol").Visibility = "Visible";
383
+ if(this.configuration['linkfromdisplay'] == 'true') {
384
+ snd.findName("PlayIcon").Visibility = "Collapsed";
385
+ } else {
386
+ snd.findName("PlayIcon").Visibility = "Visible";
387
+ }
388
+ }
389
+ try {
390
+ if(!(old == 'Completed' && stt == 'Buffering') &&
391
+ !(old == 'Buffering' && stt == 'Paused')) {
392
+ playerStatusChange(old.toUpperCase(),stt.toUpperCase());
393
+ }
394
+ } catch (err) {}
395
+ this.delegate('STATE',[old,stt]);
396
+ },
397
+
398
+ onTime: function(elp,dur) {
399
+ var snd = this.configuration['sender'];
400
+ var snd = this.configuration['sender'];
401
+ var max = snd.findName("TimeSlider").Width;
402
+ if(dur > 0) {
403
+ var pos = Math.round(max*elp/dur);
404
+ this.configuration['duration'] = dur;
405
+ snd.findName("ElapsedText").Text = jeroenwijering.utils.timestring(elp);
406
+ snd.findName("RemainingText").Text = jeroenwijering.utils.timestring(dur-elp);
407
+ snd.findName("TimeSymbol").Visibility = "Visible";
408
+ snd.findName("TimeSymbol")['Canvas.Left'] = pos+4;
409
+ snd.findName("TimeHighlight").Width = pos-2;
410
+ } else {
411
+ snd.findName("TimeSymbol").Visibility = "Collapsed";
412
+ }
413
+ this.delegate('TIME',[elp,dur]);
414
+ },
415
+
416
+ onVolume: function(pct) {
417
+ var snd = this.configuration['sender'];
418
+ snd.findName("VolumeHighlight").Width = Math.round(pct/5);
419
+ this.delegate('VOLUME',[pct]);
420
+ },
421
+
422
+ assignColorsClicks: function() {
423
+ this.display.Cursor = "Hand";
424
+ this.display.Background = "#FF"+this.configuration['screencolor'];
425
+ if(this.configuration['linkfromdisplay'] == 'false') {
426
+ this.display.addEventListener('MouseLeftButtonUp',
427
+ jeroenwijering.utils.delegate(this.controller,
428
+ this.controller.setPlay));
429
+ } else {
430
+ this.display.addEventListener('MouseLeftButtonUp',
431
+ jeroenwijering.utils.delegate(this.controller,
432
+ this.controller.setLink));
433
+ this.display.findName("PlayIcon").Visibility = "Collapsed";
434
+ }
435
+ if(this.configuration['logo'] != '') {
436
+ this.display.findName('OverlayCanvas').Visibility = "Visible";
437
+ this.display.findName('OverlayLogo').ImageSource =
438
+ this.configuration['logo'];
439
+ }
440
+ this.controlbar.findName("ControlbarBack").Fill =
441
+ "#FF"+this.configuration['backcolor'];
442
+ this.assignButton('Play',this.controller.setPlay);
443
+ this.assignButton('Stop',this.controller.setStop);
444
+ this.configuration['sender'].findName('ElapsedText').Foreground =
445
+ "#FF"+this.configuration['frontcolor'];
446
+ this.assignSlider('Time',this.changeTime);
447
+ this.configuration['sender'].findName('DownloadProgress').Fill =
448
+ "#FF"+this.configuration['frontcolor'];
449
+ this.configuration['sender'].findName('RemainingText').Foreground =
450
+ "#FF"+this.configuration['frontcolor'];
451
+ this.assignButton('Link',this.controller.setLink);
452
+ this.assignButton('Fullscreen',this.controller.setFullscreen);
453
+ this.assignButton('Mute',this.controller.setMute);
454
+ this.assignSlider('Volume',this.changeVolume);
455
+ },
456
+
457
+ assignButton: function(btn,act) {
458
+ var el1 = this.configuration['sender'].findName(btn+'Button');
459
+ el1.Cursor = "Hand";
460
+ el1.addEventListener('MouseLeftButtonUp',
461
+ jeroenwijering.utils.delegate(this.controller,act));
462
+ el1.addEventListener('MouseEnter',
463
+ jeroenwijering.utils.delegate(this,this.rollOver));
464
+ el1.addEventListener('MouseLeave',
465
+ jeroenwijering.utils.delegate(this,this.rollOut));
466
+ this.configuration['sender'].findName(btn+'Symbol').Fill =
467
+ "#FF"+this.configuration['frontcolor'];
468
+ try {
469
+ this.configuration['sender'].findName(btn+'OffSymbol').Fill =
470
+ "#FF"+this.configuration['frontcolor'];
471
+ } catch(e) {}
472
+ },
473
+
474
+ assignSlider: function(sld,act) {
475
+ var el1 = this.configuration['sender'].findName(sld+'Button');
476
+ el1.Cursor = "Hand";
477
+ el1.addEventListener('MouseLeftButtonUp',
478
+ jeroenwijering.utils.delegate(this,act));
479
+ el1.addEventListener('MouseEnter',
480
+ jeroenwijering.utils.delegate(this,this.rollOver));
481
+ el1.addEventListener('MouseLeave',
482
+ jeroenwijering.utils.delegate(this,this.rollOut));
483
+ this.configuration['sender'].findName(sld+'Slider').Fill =
484
+ "#FF"+this.configuration['frontcolor'];
485
+ this.configuration['sender'].findName(sld+'Highlight').Fill =
486
+ "#FF"+this.configuration['frontcolor'];
487
+ this.configuration['sender'].findName(sld+'Symbol').Fill =
488
+ "#FF"+this.configuration['frontcolor'];
489
+ },
490
+
491
+ delegate: function(typ,arg) {
492
+ for(var i=0; i<this.listeners.length; i++) {
493
+ if(this.listeners[i]['type'].toUpperCase() == typ) {
494
+ this.listeners[i]['func'].apply(null,arg);
495
+ }
496
+ }
497
+ },
498
+
499
+ rollOver: function(sdr) {
500
+ var str = sdr.Name.substr(0,sdr.Name.length-6);
501
+ this.configuration['sender'].findName(str+'Symbol').Fill =
502
+ "#FF"+this.configuration['lightcolor'];
503
+ try {
504
+ this.configuration['sender'].findName(str+'OffSymbol').Fill =
505
+ "#FF"+this.configuration['lightcolor'];
506
+ } catch(e) {}
507
+ },
508
+
509
+ rollOut: function(sdr) {
510
+ var str = sdr.Name.substr(0,sdr.Name.length-6);
511
+ this.configuration['sender'].findName(str+'Symbol').Fill =
512
+ "#FF"+this.configuration['frontcolor'];
513
+ try {
514
+ this.configuration['sender'].findName(str+'OffSymbol').Fill =
515
+ "#FF"+this.configuration['frontcolor'];
516
+ } catch(e) {}
517
+ },
518
+
519
+ changeTime: function(sdr,arg) {
520
+ var tbt = sdr.findName('TimeSlider');
521
+ var xps = arg.GetPosition(tbt).X;
522
+ var sec = Math.floor(xps/tbt.Width*this.configuration['duration']);
523
+ this.controller.setScrub(sec);
524
+ },
525
+
526
+ changeVolume: function(sdr,arg) {
527
+ var vbt = sdr.findName('VolumeButton');
528
+ var xps = arg.GetPosition(vbt).X;
529
+ this.controller.setVolume(xps*5);
530
+ },
531
+
532
+ resizePlayer: function() {
533
+ var wid = this.configuration['sender'].getHost().content.actualWidth;
534
+ var hei = this.configuration['sender'].getHost().content.actualHeight;
535
+ var fss = this.configuration['sender'].getHost().content.FullScreen;
536
+ if(this.configuration['shownavigation'] == 'true') {
537
+ if(fss == true) {
538
+ this.resizeDisplay(wid,hei);
539
+ this.controlbar['Canvas.Left'] = Math.round(wid/2-250);
540
+ this.resizeControlbar(500,hei-this.controlbar.Height-16);
541
+ this.controlbar.findName('ControlbarBack')['Opacity'] = 0.5;
542
+ } else {
543
+ this.resizeDisplay(wid,hei-20);
544
+ this.controlbar['Canvas.Left'] = 0;
545
+ this.resizeControlbar(wid,hei-this.controlbar.Height);
546
+ this.controlbar.findName('ControlbarBack')['Opacity'] = 1;
547
+ }
548
+ } else {
549
+ this.resizeDisplay(wid,hei);
550
+ }
551
+ },
552
+
553
+ resizeDisplay: function(wid,hei) {
554
+ this.stretchElement('PlayerDisplay',wid,hei);
555
+ this.stretchElement('VideoWindow',wid,hei);
556
+ this.stretchElement('PlaceholderImage',wid,hei);
557
+ this.centerElement('PlayIcon',wid,hei);
558
+ this.centerElement('MuteIcon',wid,hei);
559
+ this.centerElement('BufferIcon',wid,hei);
560
+ this.centerElement('BufferText',wid,hei);
561
+ this.display.findName('OverlayCanvas')['Canvas.Left'] = wid -
562
+ this.display.findName('OverlayCanvas').Width - 10;
563
+ this.display.Visibility = "Visible";
564
+ },
565
+
566
+ resizeControlbar: function(wid,yps,alp) {
567
+ this.controlbar['Canvas.Top'] = yps;
568
+ this.stretchElement('PlayerControls',wid);
569
+ this.stretchElement('ControlbarBack',wid);
570
+ this.placeElement('PlayButton',0);
571
+ var lft = 17;
572
+ this.placeElement('VolumeButton',wid-24);
573
+ this.placeElement('MuteButton',wid-37);
574
+ var rgt = 37;
575
+ if(this.configuration['showstop'] == 'true') {
576
+ this.placeElement('StopButton',lft);
577
+ lft += 17;
578
+ } else {
579
+ this.controlbar.findName('StopButton').Visibility="Collapsed";
580
+ }
581
+ if(this.configuration['usefullscreen'] == 'true') {
582
+ rgt += 18;
583
+ this.placeElement('FullscreenButton',wid-rgt);
584
+ } else {
585
+ this.controlbar.findName('FullscreenButton').Visibility =
586
+ "Collapsed";
587
+ }
588
+ if(this.configuration['link'] != '') {
589
+ rgt += 18;
590
+ this.placeElement('LinkButton',wid-rgt);
591
+ } else {
592
+ this.controlbar.findName('LinkButton').Visibility="Collapsed";
593
+ }
594
+ if(this.configuration['showdigits'] == 'true' && wid-rgt-lft> 160) {
595
+ rgt += 35;
596
+ this.controlbar.findName('RemainingButton').Visibility="Visible";
597
+ this.controlbar.findName('ElapsedButton').Visibility="Visible";
598
+ this.placeElement('RemainingButton',wid-rgt);
599
+ this.placeElement('ElapsedButton',lft);
600
+ lft +=35;
601
+ } else {
602
+ this.controlbar.findName('RemainingButton').Visibility =
603
+ "Collapsed";
604
+ this.controlbar.findName('ElapsedButton').Visibility="Collapsed";
605
+ }
606
+ this.placeElement('TimeButton',lft);
607
+ this.stretchElement('TimeButton',wid-lft-rgt);
608
+ this.stretchElement('TimeShadow',wid-lft-rgt);
609
+ this.stretchElement('TimeStroke',wid-lft-rgt);
610
+ this.stretchElement('TimeFill',wid-lft-rgt);
611
+ this.stretchElement('TimeSlider',wid-lft-rgt-10);
612
+ this.stretchElement('DownloadProgress',wid-lft-rgt-10);
613
+ var tsb = this.configuration['sender'].findName('TimeSymbol');
614
+ this.stretchElement('TimeHighlight',tsb['Canvas.Left']-5);
615
+ this.controlbar.Visibility = "Visible";
616
+ },
617
+
618
+ centerElement: function(nam,wid,hei) {
619
+ var elm = this.configuration['sender'].findName(nam);
620
+ elm['Canvas.Left'] = Math.round(wid/2 - elm.Width/2);
621
+ elm['Canvas.Top'] = Math.round(hei/2 - elm.Height/2);
622
+ },
623
+
624
+ stretchElement: function(nam,wid,hei) {
625
+ var elm = this.configuration['sender'].findName(nam);
626
+ elm.Width = wid;
627
+ if (hei != undefined) { elm.Height = hei; }
628
+ },
629
+
630
+ placeElement: function(nam,xps,yps) {
631
+ var elm = this.configuration['sender'].findName(nam);
632
+ elm['Canvas.Left'] = xps;
633
+ if(yps) { elm['Canvas.Top'] = yps; }
634
+ }
635
+ }
636
+
637
+
638
+
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+ /****************************************************************************
647
+ * The model of the player MVC triad, which stores all playback logic.
648
+ ****************************************************************************/
649
+ jeroenwijering.Model = function(cfg,ctr,vie) {
650
+ this.configuration = cfg;
651
+ this.controller = ctr;
652
+ this.view = vie;
653
+ this.video = this.configuration['sender'].findName("VideoWindow");
654
+ this.preview = this.configuration['sender'].findName("PlaceholderImage");
655
+ var str = {
656
+ 'true':'UniformToFill',
657
+ 'false':'Uniform',
658
+ 'fit':'Fill',
659
+ 'none':'None'
660
+ }
661
+ this.state = this.video.CurrentState;
662
+ this.timeint;
663
+ this.video.Stretch = str[this.configuration['overstretch']];
664
+ this.preview.Stretch = str[this.configuration['overstretch']];
665
+ this.video.BufferingTime =
666
+ jeroenwijering.utils.spanstring(this.configuration['bufferlength']);
667
+ this.video.AutoPlay = true;
668
+ this.video.AddEventListener("CurrentStateChanged",
669
+ jeroenwijering.utils.delegate(this,this.stateChanged));
670
+ this.video.AddEventListener("MediaEnded",
671
+ jeroenwijering.utils.delegate(this,this.mediaEnded));
672
+ this.video.AddEventListener("BufferingProgressChanged",
673
+ jeroenwijering.utils.delegate(this,this.bufferChanged));
674
+ this.video.AddEventListener("DownloadProgressChanged",
675
+ jeroenwijering.utils.delegate(this,this.downloadChanged));
676
+ if(this.configuration['image'] != '') {
677
+ this.preview.Source = this.configuration['image'];
678
+ }
679
+ }
680
+
681
+ jeroenwijering.Model.prototype = {
682
+ goPause: function(sec) {
683
+ this.video.pause();
684
+ if(!isNaN(sec)) {
685
+ this.video.Position = jeroenwijering.utils.spanstring(sec);
686
+ }
687
+ this.timeChanged();
688
+ },
689
+
690
+ goStart: function(sec) {
691
+ this.video.Visibility = 'Visible';
692
+ this.preview.Visibility = 'Collapsed';
693
+ if(this.state == "Closed") {
694
+ this.video.Source = this.configuration['file'];
695
+ } else {
696
+ this.video.play();
697
+ }
698
+ if(!isNaN(sec)) {
699
+ this.video.Position = jeroenwijering.utils.spanstring(sec);
700
+ }
701
+ },
702
+
703
+ goStop: function() {
704
+ this.video.Visibility = 'Collapsed';
705
+ this.preview.Visibility = 'Visible';
706
+ this.goPause(0);
707
+ this.video.Source = 'null';
708
+ this.view.onBuffer(0);
709
+ clearInterval(this.timeint);
710
+ },
711
+
712
+ goVolume: function(pct) {
713
+ this.video.Volume = pct/100;
714
+ },
715
+
716
+ stateChanged: function() {
717
+ var stt = this.video.CurrentState;
718
+ if(stt != this.state) {
719
+ this.controller.setState(this.state,stt);
720
+ this.view.onState(this.state,stt);
721
+ this.state = stt;
722
+ this.configuration['duration'] =
723
+ Math.round(this.video.NaturalDuration.Seconds*10)/10;
724
+ if(stt != "Playing" && stt != "Buffering" && stt != "Opening") {
725
+ clearInterval(this.timeint);
726
+ } else {
727
+ this.timeint = setInterval(jeroenwijering.utils.delegate(
728
+ this,this.timeChanged),100);
729
+ }
730
+ }
731
+ },
732
+
733
+ mediaEnded: function() {
734
+ if(this.configuration['repeat'] == 'true') {
735
+ this.goStart(0);
736
+ } else {
737
+ this.state = 'Completed';
738
+ this.view.onState(this.state,'Completed');
739
+ this.video.Visibility = 'Collapsed';
740
+ this.preview.Visibility = 'Visible';
741
+ this.goPause(0);
742
+ }
743
+ },
744
+
745
+ bufferChanged: function() {
746
+ var bfr = Math.round(this.video.BufferingProgress*100);
747
+ this.view.onBuffer(bfr);
748
+ },
749
+
750
+ downloadChanged: function() {
751
+ var dld = Math.round(this.video.DownloadProgress*100);
752
+ this.view.onLoad(dld);
753
+ },
754
+
755
+ timeChanged: function() {
756
+ var pos = Math.round(this.video.Position.Seconds*10)/10;
757
+ this.view.onTime(pos,this.configuration['duration']);
758
+ }
759
+ }
760
+
761
+
762
+
763
+
764
+
765
+
766
+
767
+
768
+
769
+
770
+ /****************************************************************************
771
+ * Some utility functions.
772
+ ****************************************************************************/
773
+ jeroenwijering.utils.delegate = function(obj,fcn) {
774
+ return function() {
775
+ return fcn.apply(obj,arguments);
776
+ }
777
+ }
778
+ jeroenwijering.utils.timestring = function(stp) {
779
+ var hrs = Math.floor(stp/3600);
780
+ var min = Math.floor(stp%3600/60);
781
+ var sec = Math.round(stp%60);
782
+ var str = "";
783
+ sec > 9 ? str += sec: str +='0'+sec;
784
+ min > 9 ? str = min+":"+str: str='0'+min+":"+str;
785
+ hrs > 0 ? str = hrs+":"+str: null;
786
+ return str;
787
+ }
788
+ jeroenwijering.utils.spanstring = function(stp) {
789
+ var hrs = Math.floor(stp/3600);
790
+ var min = Math.floor(stp%3600/60);
791
+ var sec = Math.round(stp%60*10)/10;
792
+ var str = hrs+':'+min+':'+sec;
793
+ return str;
794
+ }