/****************************************************************************
* 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, imgPres) {
	this.controller;
	this.model;
	this.view;
	this.configuration = {
		backgroundcolor: '000000',
		windowless: 'true',
		file: '',
		height: '260',
		image: imgPres,
		backcolor: '000000',
		frontcolor: 'CCCCCC',
		lightcolor: '000000',
		screencolor: '000000',
		width: '320',
		logo: '',
		overstretch: 'false',
		shownavigation: 'true',
		showstop: 'false',
		showelapsed: 'false',
		showremaining: '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";
				}
				snd.findName("LibellePlay").Visibility = "Collapsed";
			} else {

				if (stt == 'Buffering' || old == 'Buffering' || stt == "Playing") {
					snd.findName("BufferIcon").Visibility = "Visible";
					snd.findName("BufferText").Visibility = "Visible";
				}

				snd.findName("PlayIcon").Visibility = "Visible";
				snd.findName("PlaySymbol").Visibility = "Visible";
				snd.findName("LibellePlay").Visibility = "Visible";
				snd.findName("PlayOffSymbol").Visibility = "Collapsed";
			}
		} 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['showelapsed'] == 'true' && wid - rgt - lft > 160) {
			lft += 35;
			this.controlbar.findName('ElapsedButton').Visibility = "Visible";
			this.placeElement('ElapsedButton', lft);
		} else {
			this.controlbar.findName('ElapsedButton').Visibility = "Collapsed";
		}
		if (this.configuration['showremaining'] == 'true' && wid - rgt - lft > 160) {
			rgt += 35;
			this.controlbar.findName('RemainingButton').Visibility = "Visible";
			this.placeElement('RemainingButton', wid - rgt);
		} else {
			this.controlbar.findName('RemainingButton').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.configuration['duration'] == 0) {
			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);
		this.state = "EnDirect";
		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() {
		try {
			var pos = Math.round(this.video.Position.Seconds * 10) / 10;
			this.view.onTime(pos, this.configuration['duration']);
		}
		catch (err)
        { }
	}
}










/****************************************************************************
* 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;
}
