﻿if (typeof (MediaPlayer) == 'undefined') MediaPlayer = {};

MediaPlayer.Player = function(params) {
	var _this = this;
	this._hostID = params.HostID;
	this._autoPlay = params.AutoPlay;
	this._wmpHeight = params.DownlevelAddControlSpace ? (parseInt(params.Height) + 64) + 'px' : params.Height;

	this.Data = new MediaPlayer.Data(params.ClientMediaData, params.SelectedMediaName);
	this.Silverlight = new MediaPlayer.Silverlight(params.HostID + '_silverlight', params.HostID, params.Width, params.Height, params.XapSourcePath, params.InitParams, params.WindowlessMode);
	this.Wmp = new MediaPlayer.Wmp(params.HostID + '_wmp', params.HostID, params.Width, this._wmpHeight, params.Stretch != 0, params.WindowlessMode, params.WmpEventCallback);

	MediaPlayer.EventManager.add(window, 'onload', function(e) {
		_this.Data.initialize();
		if (!_this.Silverlight.isInstalled() && _this._autoPlay) {
			_this.Wmp.create(_this.Data.getWmpUrl());
		}
	});

	MediaPlayer.EventManager.add(window, 'onunload', function(e) {
		_this.Silverlight.dispose();
		_this.Wmp.dispose();
		_this.Data.dispose();
		_this._hostID = _this._autoPlay = _this._downlevelAddControlSpace = _this._height = null;
	});

	this.setMediaName = function(mediaName, playNow) {
		this.Data.setMedia(mediaName);
		this.Silverlight.setMedia(this.Data._selectedMediaName);

		if (playNow) this.begin();
	}

	// note: use unload when silverlight is hidden via css (prior issues w/ video & FF)
	this.unload = function() {
		if (this.Silverlight.isLoaded()) this.Silverlight.stop();
		else if (this.Wmp.isLoaded()) {
			if (this.Wmp.hasControls()) this.Wmp.getElement().controls.stop();
			this.Wmp.removeEventHandler();
		}
		var host = document.getElementById(this._hostID);
		while (host.childNodes.length > 0) host.removeChild(host.childNodes[0]);
	}

	this.begin = function() {
		if (this.Silverlight.isInstalled()) {
			if (this.Silverlight.isLoaded()) {
				this.Silverlight.play();
			} else {
				this.Silverlight.setInitParam('AutoPlay', 'true');
				this.Silverlight.create();
			}
		} else {
			if (this.Wmp.isLoaded()) this.Wmp.changeMedia(this.Data.getWmpUrl(), this.Data._selectedMediaName);
			else this.Wmp.create(this.Data.getWmpUrl());
		}
	}
}

MediaPlayer.Data = function(mediaData, selectedMediaName) {
	this._selectedMediaName = selectedMediaName;
	this._selectedMediaUrl = null;
	this._selectedAlternateMediaUrl = null;
	this._selectedPreviewImageUrl = null;

	this.initialize = function() {
		if (this._selectedMediaName && this._selectedMediaName != '') this.setMedia(this._selectedMediaName);
	}

	this.dispose = function() {
		this._selectedMediaName = this._selectedMediaUrl = this._selectedAlternateMediaUrl = this._selectedPreviewImageUrl = null;
	}

	this.setMedia = function(name) {
		this._selectedMediaName = name;
		for (var i in mediaData) {
			if (mediaData[i].Name == this._selectedMediaName) {
				this._selectedMediaUrl = mediaData[i].MediaUrl;
				this._selectedAlternateMediaUrl = mediaData[i].AlternateMediaUrl;
				this._selectedPreviewImageUrl = mediaData[i].PreviewImageUrl;
			}
		}
	}

	this.getCurrentMediaName = function() {
		return this._selectedMediaName;
	}

	this.getWmpUrl = function() {
		if (this._selectedAlternateMediaUrl && this._selectedAlternateMediaUrl != '')
			return this._selectedAlternateMediaUrl;
		else
			return this._selectedMediaUrl;
	}
}

MediaPlayer.Silverlight = function(id, hostID, width, height, xapSourcePath, initParams, windowlessMode) {
	this._initParams = initParams;

	this.dispose = function() {
		this._initParams = null;
	}

	this.isInstalled = function() {
		return Silverlight.isInstalled('2.0');
	}

	this.getElement = function() {
		try { return document.getElementById(id); }
		catch (ex) { return false; }
	}

	this.isLoaded = function() {
		try { return (this.getElement() != null && this.getElement().content != null); }
		catch (ex) { return false; }
	}

	this.play = function() {
		if (this.getElement()) this.getElement().content.MediaPlayer.Play();
	}

	this.pause = function() {
		if (this.getElement()) this.getElement().content.MediaPlayer.Pause();
	}

	this.stop = function() {
		if (this.getElement()) this.getElement().content.MediaPlayer.Stop();
	}

	this.setMedia = function(name) {
		this.setInitParam('SelectedMediaName', name);
		if (this.getElement()) this.getElement().content.MediaPlayer.SetMediaReference(name);
	}

	this.create = function() {
		document.getElementById(hostID).innerHTML = this.getMarkup();
	}

	this.getMarkup = function() {
		var sl_embed = '<object id="' + id + '" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width=' + width + ' height=' + height + '>';
		sl_embed += '<param name="source" value="' + xapSourcePath + '"/>';
		sl_embed += '<param name="onerror" value="onSilverlightError" />';
		sl_embed += '<param name="background" value="black" />';
		sl_embed += '<param name="minRuntimeVersion" value="2.0.31005.0" />';
		sl_embed += '<param name="autoUpgrade" value="true" />';
		sl_embed += '<param name="windowless" value="' + ((windowlessMode) ? 'true' : 'false') + '" />';
		sl_embed += '<param name="initParams" value="' + this._initParams + '" />';
		sl_embed += '</object>';
		return sl_embed;
	}

	this.setInitParam = function(key, value) {
		var newParam = key + '=' + value;
		var slParams = this._initParams.split(',');
		for (var i in slParams) {
			if (slParams[i].indexOf(key) == 0) {
				this._initParams = this._initParams.replace(slParams[i], newParam);
				return;
			}
		}
		this._initParams = this._initParams + ',' + newParam;
	}
}

MediaPlayer.Wmp = function(id, hostID, width, height, stretch, windowlessMode, eventHandler) {
	var _this = this;
	this._isVideoStarted = false;

	this.dispose = function() {
		this._isVideoStarted = null;
	}

	this.getElement = function() {
		try { return document.getElementById(id); }
		catch (ex) { return false; }
	}

	this.getCurrentPosition = function() {
		return this.getElement().controls.currentPosition;
	}

	this.getDuration = function() {
		return this.getElement().currentMedia.duration;
	}

	this.isLoaded = function() {
		try { return (this.getElement() != null); }
		catch (ex) { return false; }
	}

	this.hasControls = function() {
		return this.getElement() && this.getElement().controls;
	}

	this.create = function(mediaUrl) {
		document.getElementById(hostID).innerHTML = this.getMarkup(mediaUrl);
		this.addEventHandler();
	}

	this.addEventHandler = function() {
		if (eventHandler && this.isLoaded()) MediaPlayer.EventManager.add(_this.getElement(), 'playstatechange', eventHandler);
	}

	this.removeEventHandler = function() {
		if (eventHandler && this.isLoaded()) MediaPlayer.EventManager.remove(_this.getElement(), 'playstatechange', eventHandler);
	}

	this.changeMedia = function(mediaUrl, mediaName) {
		if (this.hasControls()) {
			this.getElement().controls.stop();
			document.getElementById(hostID).innerHTML = '';
			this.create(mediaUrl);
		}
		else
			window.location = '?mname=' + mediaName + '&autoplay=true';
	}

	this.getMarkup = function(mediaUrl) {
		var wmv_embed = '<object id="' + id + '" width="' + width + '" height="' + height + '" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-ms-wmp">';
		wmv_embed += '<param value="' + mediaUrl + '" name="url" />';
		wmv_embed += '<param value="false" name="ShowStatusBar"/>';
		wmv_embed += '<param value="true" name="autoStart"/>';
		wmv_embed += '<param value="' + stretch.toString() + '" name="stretchToFit"/>';
		wmv_embed += '<param value="' + windowlessMode.toString() + '" name="windowlessVideo"/>';
		wmv_embed += '<embed width="' + width + '" height="' + height + '" autosize="true" autostart="1" ';
		wmv_embed += 'showstatusbar="false" showdisplay="0" showcontrols="true" ';
		wmv_embed += 'name="MediaPlayer" id="' + hostID + '_wmp" ';
		wmv_embed += 'src="' + mediaUrl + '" ';
		wmv_embed += 'pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" ';
		wmv_embed += 'type="application/x-mplayer2" />';
		wmv_embed += '</object>';
		return wmv_embed;
	}
}

MediaPlayer.EventManager = new function() {
	var _this = this;
	var _evts = [];

	this.dispose = dispose;

	this.add = addEvent;
	this.clear = clearEvents;
	this.remove = removeEvent;

	this.add(window, 'onunload', dispose);
	
	function dispose() {
		_this.clear();
		_this = _evts = null;
	}

	function addEvent(elt, nm, fnc, grab) {
		if (elt && (elt == window || elt.nodeType) && typeof (fnc) == 'function') {
			var evt = { elt: elt, name: nm, func: fnc, grab: !!grab };
			_evts.push(evt);
			if (elt.attachEvent) return elt.attachEvent(nm, fnc);
			if (elt.addEventListener) return elt.addEventListener(nm.replace(/^on/, ''), fnc, !!grab);
			elt[nm] = fnc;
		}
	}
	function clearEvent(evt) {
		var elt = evt.elt, fnc = evt.func, nm = evt.name, grab = evt.grab;
		if (elt && (elt == window || elt.nodeType) && typeof (fnc) == 'function') {
			if (elt.attachEvent) return elt.detachEvent(nm, fnc);
			if (elt.addEventListener) return elt.removeEventListener(nm.replace(/^on/, ''), fnc, grab);
			elt[nm] = null;
		}
	}
	function clearEvents() {
		for (var i = 0; i < _evts.length; i++) clearEvent(_evts[i]);
	}
	function removeEvent(elt, nm, fnc, grab) {
		for (var i = _evts.length - 1; i >= 0; i--) {
			if (_evts[i].elt == elt && _evts[i].name == nm && _evts[i].func == fnc && _evts[i].grab == !!grab) {
				clearEvent(_evts[i]);
				_evts[i].elt = _evts[i].name = _evts[i].func = _evts[i].grab = null;
				_evts.splice(i, 1);
				break;
			}
		}
	}
}

function SilverlightMediaEvent(mediaName, eventName, args) {
	//alert(mediaName + eventName);
}