/// SL1 MediaPlayer Area
SL1PlayerArea = function(container, containingWindow, id)
{
SL1PlayerArea.initializeBase(this, [container, containingWindow, id]);
this.media = null;
this.SlideCheckInterval = 5000;
this.SetupPlayer = function()
{
var playerVideoArea = $('PlayerVideo');
playerVideoArea.setAttribute('align', 'center');
this.CreateObject();
this.AdjustSize();
}
this.CreateObject = function()
{
Silverlight.createObjectEx({
source: this.GetXamlLocation(),
parentElement: $('PlayerVideo'),
id: 'EmbeddedPlayer',
properties:
{ width: LayoutOptions.VideoWidth,
height: LayoutOptions.VideoHeight,
background: 'black',
isWindowless: 'false',
framerate: '24',
version: '1.0'
},
events:
{ onError: this.OnMediaError.bind(this), onLoad: this.OnMediaLoad.bind(this) },
context: null
});
}
this.GetXamlLocation = function()
{
var mainStylesheetLink = document.getElementById("mainStylesheet").href;
return mainStylesheetLink.replace(/main.css/i, "SL1.xaml");
}
this.OnMediaError = function(sender, args)
{
if (args['errorCode'] == 1001 && Manifest.VideoUrl.toLowerCase().substr(0, 4) == 'http')
{
return;
}
this.HandleMediaPlayerError(this.FormatErrorMessage(args));
}
this.OnMediaLoad = function()
{
this.embeddedPlayer = $('EmbeddedPlayer');
mss.OnLoad(this.embeddedPlayer);
this.media = mss.FindName('media');
this.media.width = LayoutOptions.VideoWidth;
this.media.height = LayoutOptions.VideoHeight;
this.AttachMediaEvents();
this.pci = new SfMediaPlayer.SL1.PlayerControl(this.media);
this.AddEventHandlers();
this.SetMediaSource();
this.Volume = new SfMediaPlayer.Volume(this.pci);
this.timerManager = new SfMediaPlayer.SL1.TimerManager(this);
}
this.SetMediaSource = function()
{
if (Manifest.UnicastVideoUrl && Manifest.UnicastVideoUrl.length > 0)
{
this.pci.SetMedia(Manifest.UnicastVideoUrl);
}
else
{
this.pci.SetMedia(Manifest.VideoUrl);
}
}
this.fullScreenChange = function(sender, args)
{
var embeddedSLMedia = mss.FindName('media');
embeddedSLMedia.Width = mss.content.ActualWidth;
embeddedSLMedia.Height = mss.content.ActualHeight;
this.hideFullScreenPrompt();
}
this.hideFullScreenPrompt = function()
{
mss.SetVisible("fsText", false);
mss.SetVisible("fsTextBackground", false);
}
this.MouseEnter = function(sender, args)
{
if (this.embeddedPlayer.content.fullScreen)
{
return;
}
var playState = this.pci.GetPlayState();
if (playState != SfKernel.MediaState.Playing && playState != SfKernel.MediaState.Paused)
{
return;
}
mss.SetVisible("fsTextBackground", true);
mss.SetVisible("fsText", true);
var fsText = mss.FindName("fsText");
var fsTextBackground = mss.FindName("fsTextBackground");
fsText.Text = Localization.MediaPlayer.SilverlightFullScreenPrompt;
fsText.width = LayoutOptions.VideoWidth;
fsTextBackground.width = LayoutOptions.VideoWidth;
mss.AlignText(mss.FindName("fsText"), TextAlign.CenterVertical | TextAlign.CenterHorizontal);
}
this.MouseLeave = function(sender, args)
{
this.hideFullScreenPrompt();
}
this.MouseLeftButtonUp = function(sender, args)
{
var playState = this.pci.GetPlayState();
if (playState != SfKernel.MediaState.Playing && playState != SfKernel.MediaState.Paused)
{
return;
}
if (!this.embeddedPlayer.content.fullScreen)
{
this.embeddedPlayer.content.fullScreen = true;
return;
}
if (Manifest.PlayStatus == SfKernel.PresentationPlayStatus.OnDemand)
{
if (playState == SfKernel.MediaState.Paused)
{
this.Play();
}
else if (playState == SfKernel.MediaState.Playing)
{
this.Pause();
}
}
}
this.AttachMediaEvents = function()
{
this.embeddedPlayer.content.onFullScreenChange = SfEvent.createDelegate(this, this.fullScreenChange);
var videoArea = mss.FindName("videoArea");
{
videoArea.addEventListener("MouseEnter", SfEvent.createDelegate(this, this.MouseEnter));
videoArea.addEventListener("MouseLeave", SfEvent.createDelegate(this, this.MouseLeave));
videoArea.addEventListener("MouseLeftButtonUp", SfEvent.createDelegate(this, this.MouseLeftButtonUp));
}
this.media.addEventListener('mediaOpened', this.OnMediaOpened.bind(this));
this.media.addEventListener('mediaFailed', this.OnMediaFailed.bind(this));
this.media.addEventListener('currentStateChanged', this.OnMediaCurrentStateChanged.bind(this));
this.media.addEventListener('markerReached', this.OnMediaMarkerReached.bind(this));
}
this.OnMediaOpened = function()
{
mPlayer.VolumeSliderInstance.OnLoad();
mPlayer.PlayerSliderInstance.OnLoad();
mPlayer.ReportViewerPageOpened();
if (this.media.NaturalVideoHeight == 0)
{
Manifest.HasVideo = false;
}
else
{
Manifest.HasVideo = true;
}
mPlayer.EventManager.PostEvent(SfKernel.EventType.MediaOpened, this, null);
this.InitVolume();
this.HandleAudioOnly();
this.LoadAudioLanguages();
switch (Manifest.PlayStatus)
{
case SfKernel.PresentationPlayStatus.Live:
if (mPlayer.PlayerDetect.IsMacPPC())
{
this.timerManager.pollLiveSlides = true;
}
break;
case SfKernel.PresentationPlayStatus.OnDemand:
this.AddTimelineMarkers();
break;
}
this.PostMediaLengthObtainedEvent();
this.CheckStartStopTimes();
this.timerManager.Start();
}
this.LoadAudioLanguages = function()
{
var languageCount = this.pci.GetAudioLanguageCount();
if (languageCount > 1)
{
var AudioLanguages = new Array(languageCount);
for (var i = 0; i < languageCount; ++i)
{
//Silverlight currently does not provide locale info
AudioLanguages[i] = new SfKernel.AudioLanguageEntry(i, 0, Localization.Common.AudioTrack + ' ' + (i + 1));
}
mPlayer.LoadAudioLanguages(AudioLanguages, 1);
}
}
this.OnMediaFailed = function(sender, args)
{
this.HandleMediaPlayerError(this.FormatErrorMessage(args));
}
this.OnMediaLoaded = function(sender, args)
{
}
this.OnMediaCurrentStateChanged = function(sender, args)
{
var playState = this.pci.GetPlayState();
if (this.currentMediaState != playState)
{
this.currentMediaState = playState;
mPlayer.EventManager.PostEvent(SfKernel.EventType.PlayStateChanged, this, playState);
this.CheckIfLiveEnded(playState);
}
}
this.OnMediaMarkerReached = function(sender, args)
{
var scriptType = args['marker']['type'];
var scriptParam = args['marker']['text'];
this.ScriptParser.ParseScriptFromStream(scriptType, scriptParam);
}
this.AddTimelineMarkers = function()
{
var markers = this.media['markers'];
markers.clear();
for (var i = 0; i < Manifest.Slides.length; ++i)
{
var marker = this.embeddedPlayer.content.createFromXaml("");
markers.add(marker);
}
var marker = this.embeddedPlayer.content.createFromXaml("");
markers.add(marker);
}
this.getFormattedTiming = function(posInMS)
{
var parsed = this.pci.ParseTime(posInMS);
return parsed.HH + ":" + parsed.MM + ":" + parsed.SS + "." + parsed.FF;
}
this.FormatErrorMessage = function(args)
{
var errorDescription;
switch (args['errorCode'])
{
case 4001:
errorDescription = Localization.MediaPlayer.SilverlightNetworkError + "
(" + args['errorMessage'] + ")";
break;
case 2203:
errorDescription = Localization.MediaPlayer.SilverlightSetValueError + args['methodName'] + "
";
break;
default:
errorDescription = Localization.MediaPlayer.GeneralError + "
(" + args['errorCode'] + " - " + args['errorMessage'] + ")";
break;
}
return errorDescription;
}
this.HideMediaPlayerDiv = function()
{
var playerElement = $('PlayerVideo');
var notReady = $('PlayerNotStarted');
if (Silverlight.isInstalled('1.0'))
{
if (playerElement)
{
playerElement.style.display = 'none';
}
if (notReady)
{
notReady.style.display = '';
}
}
else
{
if (playerElement)
{
playerElement.setAttribute("align", "center");
playerElement.style.display = '';
var slPluginHelper = new Object();
slPluginHelper.version = '1.0';
playerElement.innerHTML = Silverlight.buildPromptHTML(slPluginHelper);
}
if (notReady)
{
notReady.style.display = 'none';
}
}
}
}
SL1PlayerArea.registerClass('SL1PlayerArea', MediaPlayerArea);
/// SL1 MediaPlayer Control
Type.registerNamespace('SfMediaPlayer.SL1');
SfMediaPlayer.SL1.PlayerControl = function(embeddedMedia)
{
this.media = embeddedMedia;
this.Play = function()
{
this.media.play();
}
this.Stop = function()
{
this.media.stop();
}
this.Pause = function()
{
this.media.pause();
}
this.GetPlayState = function()
{
var state = this.media.currentState;
return this.convertSL1StateToPlayState(state);
}
this.SetMedia = function(loc)
{
this.media.source = loc;
}
this.GetPosition = function()
{
return this.media.position.seconds * 1000;
}
this.ParseTime = function(timeInMS)
{
var hh = Math.floor(timeInMS/3600000);
var remainingMS = timeInMS - hh*3600000;
var mm = Math.floor(remainingMS/60000);
remainingMS = remainingMS - mm*60000;
var ss = Math.floor(remainingMS/1000);
remainingMS = remainingMS = ss*1000;
var ff = Math.floor(remainingMS);
return {HH:hh, MM:mm, SS:ss, FF:ff};
}
this.SetPosition = function(posInMS)
{
var parsed = this.ParseTime(posInMS);
var strPos = String.format('{0}:{1}:{2}.{3}', parsed.HH, parsed.MM, parsed.SS, parsed.FF);
try
{
if(this.GetPlayState() == SfKernel.MediaState.Playing)
{
//prevent SL video freeze bug
this.Pause();
this.media.position = strPos;
this.Play();
}
else
{
this.media.position = strPos;
}
}
catch(e)
{
}
}
this.GetMediaDuration = function()
{
return this.media.naturalDuration.seconds * 1000;
}
this.SetVolume = function(val)
{
this.media.volume = val/100;
}
this.GetVolume = function()
{
return this.media.volume * 100;
}
this.SetMute = function(val)
{
this.media.isMuted = val;
}
this.convertSL1StateToPlayState = function(state)
{
switch (state.toLowerCase())
{
case 'buffering':
return SfKernel.MediaState.Buffering;
case 'closed':
return SfKernel.MediaState.Closed;
case 'error':
return SfKernel.MediaState.Error;
case 'opening':
return SfKernel.MediaState.Opening;
case 'paused':
return SfKernel.MediaState.Paused;
case 'playing':
return SfKernel.MediaState.Playing;
case 'stopped':
return SfKernel.MediaState.Stopped;
default:
return SfKernel.MediaState.Undefined;
}
}
this.SetPlaybackSpeed = function(speed)
{
throw Error.notImplemented();
}
this.SetFullScreen = function(fs)
{
throw Error.notImplemented();
}
this.GetAudioLanguageCount = function()
{
return this.media.AudioStreamCount;
}
this.SetAudioLanguageIndex = function(index)
{
this.media.AudioStreamIndex = index;
}
}
/// SL1 MediaPlayer Timer Manager
SfMediaPlayer.SL1.TimerManager = function(mediaPlayer)
{
this.player = mediaPlayer;
this.positionTimer = null;
this.slideUpdateTimer = null;
this.pollLiveSlides = false;
this.timerInterval = 200;
this.Start = function()
{
clearTimeout(this.positionTimer);
this.TimedUpdate();
if(this.pollLiveSlides)
{
clearTimeout(this.slideUpdateTimer);
this.TimedSlideUpdate();
}
}
this.Stop = function()
{
this.PostTimerUpdatedEvent(this.player.pci.GetPosition());
clearTimeout(this.positionTimer);
clearTimeout(this.slideUpdateTimer);
}
this.PostTimerUpdatedEvent = function(pos)
{
mPlayer.EventManager.PostEvent(SfKernel.EventType.TimerLoop, this, {"Position":pos});
}
this.TimedUpdate = function()
{
if(!mPlayer.PlayerSliderInstance.IsCurrentlyDragging && this.player.pci.GetPlayState() == SfKernel.MediaState.Playing)
{
var currentPosition = this.player.pci.GetPosition();
if(this.player.LastSeekPosition > currentPosition)
{
this.positionTimer = setTimeout(this.TimedUpdate.bind(this),this.timerInterval);
return;
}
this.PostTimerUpdatedEvent(currentPosition);
if(this.player.StopTime && this.player.StopTime < currentPosition)
{
this.player.Pause();
this.player.StopTime = null;
mPlayer.PlayerPositionPanelInstance.SetDisplayText(Localization.MediaPlayer.ClipEnded);
return;
}
}
this.positionTimer = setTimeout(this.TimedUpdate.bind(this), this.timerInterval);
}
this.TimedSlideUpdate = function()
{
SonicFoundry.Mediasite.Player.DataAccess.PlayerService.GetLiveStatus
(
Manifest.PresentationId,
Function.createDelegate(this, this.GetPresentationStatusInformationOnSuccess),
Function.createDelegate(this, this.GetPresentationStatusInformationOnFailure),
'GetLiveStatus'
);
}
this.GetPresentationStatusInformationOnSuccess = function(result, context)
{
if (result.PlayStatus != SfKernel.PresentationPlayStatus.Live)
{
mPlayer.EventManager.PostEvent(SfKernel.EventType.Script, this, {Command: SfKernel.ScriptCmdType.EndPresentation});
}
else
{
if(result.CurrentSlide > 0 && result.CurrentSlide > mPlayer.CurrentSlideNumber)
{
for(var i=mPlayer.CurrentSlideNumber; itoken)
{
this.delegateList[token]=null;
}
}
}
function EventList()
{
this.namedEvents=new Array(arguments.length);
for(var i=0;i