$(document).ready(function()
{
    //window.avVideoPlayer = document.forms[0].avVideoPlayer;

    // Embed the media player
    swfobject.embedSWF('/assets/avVideoPlayer_V3.swf', 'avPlayerHolder', '823', '366', '8.0.0', false,
	    { videoXML: '/xml/video.xml' }, /* Flash Vars */
	    {allowscriptaccess: 'always', swliveconnect: 'true', wmode: 'transparent' }, /* Params */
	    {id: 'avVideoPlayer'} /* Attributes */);

    Globals.getTheme();
    RolesProvider.getUserInfo({
        onSuccess: function(oUserInfo)
        {
            MPlayer.handleFavoritesPermissions();
        }
    });

    MPlayerOverlay.create();

    // Display a default message in the search box
    MPlayer.showResultsMessage('Enter a query in the box below to quickly search our collection of media!', 'search');

    // Set up playlist interaction here
    // favorites are set up in perms handler
    MPlayer.refreshPlaylistDroppable('nextUp');
    MPlayer.refreshPlaylistSortable('nextUp');
    MPlayer.refreshPlaylistTabDroppable('nextUp');

    MPlayer.refreshPlayerDroppable();

    MPlayer.refreshTrashDroppable();

    MPlayer.showPlaylistTab('nextUp');
    MPlayer.showResultsTab('search');

    MPlayer.bindSearchSubmit();

    // Once everything is loaded check the querystring
    if (Globals.queryString('media').length > 0)
    {
        MPlayerAsync.playMediaFromId(Globals.queryString('media'));
    }
    else if (Globals.queryString('mcid').length > 0)
    {
        // Empty current playlist and populate it with the clicked one
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetSuggestedPlaylistMedia',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: '{"contentId": ' + Globals.queryString('mcid') + ', "resultLimit": 0}',
            success: function(d)
            {
                var m = d.d;
                $('#nextUpPlaylist').empty();

                if (m.d.MediaFiles.length > 0)
                {
                    var firstItem = null;
                    for (var i = 0; i < m.d.MediaFiles.length; i++)
                    {
                        var ele = MPlayerUtils.createPlaylistObject({
                            mediaId: m.d.MediaFiles[i].MediaId,
                            fileType: m.d.MediaFiles[i].FileType,
                            fileName: m.d.MediaFiles[i].FileName,
                            title: m.d.MediaFiles[i].Title,
                            subtitle: m.d.MediaFiles[i].Subtitle,
                            description: m.d.MediaFiles[i].Description,
                            thumbnailFileName: m.d.MediaFiles[i].ThumbnailFileName,
                            height: m.d.MediaFiles[i].Height,
                            width: m.d.MediaFiles[i].Width,
                            duration: m.d.MediaFiles[i].Duration,
                            durationText: m.d.MediaFiles[i].DurationText,
                            authorName: m.d.MediaFiles[i].AuthorName,
                            authorDescription: m.d.MediaFiles[i].AuthorDescription
                        });
                        MPlayer.appendToPlaylist(ele, 'nextUp');

                        if (i == 0)
                        {
                            // Save a reference to the first item so we can start playing it
                            firstItem = ele;
                        }
                    }

                    MPlayer.playMedia(firstItem);
                }
                else
                {
                    // Empty playlist!
                }
            },
            error: function(xhr, msg)
            {
            }
        });
    }
    else
    {
        // No query string, do a featured content search
        $('#txtQuickSearch').val("Featured Content");
        $("#btnQuickSearch").click();
    }
});

var MPlayer = function()
{
    var _sCurrPlaylist = '';
    var _sCurrResults = '';

    var _oCurrMediaElement = null;
    var _iCurrMediaId = 0;

    var _MAXRETRIES = 6;
    var _iNumRetries = 0;
    var _tRetryTimer = 0;
    var _oRetryDetails = null;

    function _bindSearchSubmit()
    {
        $('#txtQuickSearch')
			.keypress(function(e)
			{
			    switch (e.keyCode)
			    {
			        case 13:
			            // Handle search
			            MPlayerAsync.getQuickSearchResults($('#txtQuickSearch').val());
			            return false;
			        default:
			            return true;
			    }
			})
			.focus(function(e)
			{
			    $(this).select();
			});
    }

    function _playMediaFromRetryDetails()
    {
        if (_oRetryDetails != null)
        {
            _playMediaFromDetails(_oRetryDetails);
        }
    }

    function _playMediaFromDetails(vidDetails)
    {
        _iCurrMediaId = vidDetails.mediaId;
        var player = MPlayer.getPlayer('avVideoPlayer');
        var bResultOfRetry = false;

        // Test for player
        if (!player.playVideo || !player.playAudio)
        {
            // Check how many retries
            if (_iNumRetries < _MAXRETRIES)
            {
                _oRetryDetails = vidDetails;
                _iNumRetries++;
                _tRetryTimer = setTimeout(_playMediaFromRetryDetails, 500);
            }
        }
        else
        {
            if (_iNumRetries > 0)
                bResultOfRetry = true;

            // Make sure all the retry stuff is reset
            _iNumRetries = 0;
            clearTimeout(_tRetryTimer);
            _tRetryTimer = 0;
            _oRetryDetails = null;

            var sTnUrl = ""

            if (vidDetails.thumbnailFileName.length > 0)
            {
                sTnUrl = MPlayerConfig.mediaTnDir + vidDetails.mediaId + '_' + vidDetails.thumbnailFileName;
            }
            else
            {
                sTnUrl = MPlayerConfig.mediaTnDir + 'defaultMedia.jpg';
            }

            if (!bResultOfRetry)
            {
                $('#nextUpPlaylist > .playlistItem').removeClass('mediaPlaying');
            }

            switch (vidDetails.fileType * 1) /* Multiplied to convert to int */
            {
                case Globals.fileTypes.audio:
                    player.playAudio(MPlayerConfig.mediaDir + vidDetails.fileName,
						vidDetails.title, vidDetails.subtitle, vidDetails.description,
						vidDetails.durationText, sTnUrl);
                    break;
                case Globals.fileTypes.both:
                case Globals.fileTypes.video:
                default:
                    player.playVideo(MPlayerConfig.mediaDir + vidDetails.fileName,
						vidDetails.title, vidDetails.subtitle, vidDetails.description,
						vidDetails.durationText);
                    break;
            }


            MPlayerAsync.getSameContentResults(vidDetails.mediaId, 'speaker');
            MPlayerAsync.getSameContentResults(vidDetails.mediaId, 'topic');
            MPlayerAsync.getSameContentResults(vidDetails.mediaId, 'passage');
        }
    }

    function _playMedia(obj)
    {
        var player = MPlayer.getPlayer('avVideoPlayer');
        var ele = $(obj);
        var vidDetails = null;

        if (ele.hasClass('searchResultsItem'))
        {
            _oCurrMediaElement = null;
            _iCurrMediaId = 0;
            vidDetails = MPlayerUtils.getResultDetails(ele);

            if (vidDetails.fileName.length > 0)
            {
                _oCurrMediaElement = ele;

                MPlayer.playMediaFromDetails(vidDetails);
            }
            else
            {
                player.showOverlay();
            }
        }
        else if (ele.hasClass('playlistDraggable') || ele.hasClass('playlistItem'))
        {
            _oCurrMediaElement = null;
            vidDetails = MPlayerUtils.getPlaylistDetails(ele);
            if (vidDetails.fileName.length > 0)
            {
                _oCurrMediaElement = ele;

                MPlayer.playMediaFromDetails(vidDetails);

                if (ele.hasClass('playlistDraggable'))
                {
                    var parent = ele.parent('.playlistItem');
                    if (parent)
                    {
                        parent.addClass('mediaPlaying');
                    }
                }
                else if (ele.hasClass('playlistItem'))
                {
                    ele.addClass('mediaPlaying');
                }
            }
            else
            {
                player.showOverlay();
            }
        }
        else
        {
            player.showOverlay();
        }
    }

    function _playNextMedia()
    {
        var currentVideo = $('#nextUpPlaylist > .mediaPlaying');
        MPlayer.playMedia(currentVideo.next());
    }

    function _refreshTrashDroppable()
    {
        $('#trashCan').droppable({
            accept: '.playlistDraggable',
            tolerance: 'pointer',
            drop: function(el, ui)
            {
                $(ui.draggable).parent().remove();
                MPlayer.refreshPlaylistCount(_sCurrPlaylist);

                ui.helper.remove();

                if (_sCurrPlaylist == 'favorites')
                    MPlayerAsync.persistFavoritesList();
            }
        });
        $('#trashCan').dblclick(
			function()
			{
			    if ($('#' + _sCurrPlaylist + 'Playlist > .playlistItem').length > 0)
			    {
			        var sCP = _sCurrPlaylist;

			        $('#playlistConfText').text('This will remove all your selections from the list, are you sure you\'d like to do this?');
			        $('#playlistConfYes')
						.unbind('click')
						.click(
							function()
							{
							    $('#' + sCP + 'Playlist').empty();
							    MPlayer.refreshPlaylistCount(sCP);

							    MPlayer.showPlaylistTab(sCP);

							    if (sCP == 'favorites')
							    {
							        MPlayerAsync.persistFavoritesList();
							    }
							}
						);
			        $('#playlistConfNo')
						.unbind('click')
						.click(
							function()
							{
							    MPlayer.showPlaylistTab(sCP);
							}
						);

			        MPlayer.showPlaylistTab('confirm');
			    }
			}
		);
    }

    function _refreshResultsDraggable(sTab)
    {
        $('#' + sTab + 'Results > .searchResultsItem')
			.not('.ui-draggable') /* Don't modify already draggable items */
			.draggable({
			    helper: 'clone',
			    appendTo: 'body',
			    zIndex: 2000,
			    revert: true,
			    opacity: 0.5,
			    distance: 5,
			    start: function(el, ui)
			    {
			        var ele = $(ui.helper);
			        ele.addClass('resultsDragging');
			        ele.find('.resultsOverlay')
						.removeClass('resultsOverlayOn')
						.addClass('resultsOverlayOff');
			    }
			});
    }

    function _showPlaylistMessage(sMsg, sTab)
    {
        $('#' + sTab + 'Playlist')
			.empty()
			.append($('<div class="playlistContainerCentered"></div>')
				.text(sMsg)
			);
    }

    function _appendToPlaylist(oEle, sPlaylist)
    {
        var details = MPlayerUtils.getResultDetails(oEle);
        if ($('#' + sPlaylist + 'Playlist').find('.playlistContainerCentered').length > 0)
        {
            $('#' + sPlaylist + 'Playlist').empty();
        }

        // First check if this is the favorites list
        if (sPlaylist == 'favorites')
        {
            // It is, make sure this fav isn't a dupe
            var eles = $('#favoritesPlaylist > .playlistItem');
            for (var i = 0; i < eles.length; i++)
            {
                var dets = MPlayerUtils.getPlaylistDetails(eles[i]);
                if (details.mediaId == dets.mediaId)
                {
                    // Found a dupe, return without doing anything
                    return;
                }
            }
        }

        var ele = MPlayerUtils.createPlaylistObject(details);

        $('#' + sPlaylist + 'Playlist').append(ele);

        switch (sPlaylist)
        {
            case 'nextUp':
                if ($('#' + sPlaylist + 'Playlist').children().length == 1)
                {
                    // This is the only video added to the playlist, start playing it
                    var player = MPlayer.getPlayer('avVideoPlayer');
                    if (!player.isPlayingKTHX || !player.isPlayingKTHX())
                    {
                        MPlayer.playMedia(ele);
                    }
                }
                ele.dblclick(
					function()
					{
					    MPlayer.playMedia(this);
					}
				);
                break;
            case 'favorites':
                ele.dblclick(
					function()
					{
					    MPlayer.appendToPlaylist(this, 'nextUp');
					}
				);
                break;
        }

        MPlayer.refreshPlaylistDraggable(sPlaylist);
        MPlayer.refreshPlaylistCount(sPlaylist);
    }

    function _refreshPlaylistDraggable(sPlaylist)
    {
        $('#' + sPlaylist + 'Playlist > .playlistItem > .playlistDraggable')
			.not('.ui-draggable') /* Don't modify already draggable items */
			.draggable({
			    helper: 'clone',
			    appendTo: 'body',
			    zIndex: 2000,
			    revert: true,
			    opacity: 0.5,
			    distance: 5,
			    start: function(el, ui)
			    {
			        $(ui.helper).addClass('playlistDragging');
			    }
			});
    }

    function _refreshPlaylistDroppable(sPlaylist)
    {
        $('#' + sPlaylist + 'Playlist').droppable({
            accept: '.searchResultsItem',
            tolerance: 'pointer',
            drop: function(el, ui)
            {
                MPlayer.appendToPlaylist(ui.helper, sPlaylist);

                if (sPlaylist == 'favorites')
                {
                    MPlayerAsync.persistFavoritesList();
                }

                ui.helper.remove();
            }
        });
    }

    function _refreshPlaylistTabDroppable(sPlaylist)
    {
        $('#' + sPlaylist + 'Tab').droppable({
            accept: '.playlistDraggable',
            tolerance: 'pointer',
            drop: function(el, ui)
            {
                if ($('#' + sPlaylist + 'Playlist').find('.playlistContainerCentered').length > 0)
                {
                    $('#' + sPlaylist + 'Playlist').empty();
                }

                MPlayer.appendToPlaylist(ui.helper, sPlaylist);

                if (sPlaylist == 'favorites')
                {
                    MPlayerAsync.persistFavoritesList();
                }

                ui.helper.remove();
            }
        });
    }

    function _refreshPlaylistSortable(sPlaylist)
    {
        $('#' + sPlaylist + 'Playlist').sortable({
            axis: 'y',
            containment: 'parent',
            handle: '.playlistHandle',
            placeholder: 'playlist_placeHolder',
            start: function(el, ui)
            {
                var MOVEOFFSET = 10;
                $('body').mousemove(function(ev)
                {
                    if (_sCurrPlaylist.length > 0)
                    {
                        var ele = $('#' + _sCurrPlaylist + 'Playlist');
                        var eleH = ele.height();
                        var eleW = ele.width();
                        var eleX = ev.pageX - ele.offset().left;
                        var eleY = ev.pageY - ele.offset().top;

                        if (Math.abs(eleY) <= MOVEOFFSET)
                        {
                            // Top bounds, move up
                            ele.scrollTo('-=43px', 200);
                        }
                        else if (Math.abs((eleH - eleY)) <= MOVEOFFSET)
                        {
                            // Bottom bounds, move down
                            ele.scrollTo('+=43px', 200);
                        }
                    }
                });
            },
            stop: function(el, ui)
            {
                if (_sCurrPlaylist == 'favorites')
                {
                    MPlayerAsync.persistFavoritesList();
                }
                $('body').unbind('mousemove');
            }
        });
    }

    function _refreshPlayerDroppable()
    {
        $('#avPlayerContainer').droppable({
            accept: '.searchResultsItem, .playlistDraggable',
            tolerance: 'pointer',
            drop: function(el, ui)
            {
                ui.helper.remove();

                MPlayer.playMedia(ui.draggable);
            }
        });
    }

    function _addSelectionToFavorites()
    {
        if (_oCurrMediaElement != null && RolesProvider.isLoggedIn())
        {
            if ($('#favoritesPlaylist').find('.playlistContainerCentered').length > 0)
            {
                $('#favoritesPlaylist').empty();
            }

            MPlayer.appendToPlaylist(_oCurrMediaElement, 'favorites');

            MPlayerAsync.persistFavoritesList();
        }
    }

    function _handleEmailSelection()
    {
        var sCP = _sCurrPlaylist;

        $('#emailFriend').val('');
        $('#emailMessage').val('');
        $('#emailSend')
			.unbind('click')
			.click(
				function()
				{
				    // Handle sending here

				    if ($('#emailFriend').val().length < 1)
				    {
				        $('#playlistMsgText').text('Please enter an email address to send this selection to!');
				        $('#playlistMsgButtonText').text('OK');
				        $('#playlistMsgButton')
							.unbind('click')
							.click(
								function()
								{
								    MPlayer.showPlaylistTab('email');
								}
							);
				        MPlayer.showPlaylistTab('message');
				    }
				    else
				    {
				        var oData = {
				            EmailAddress: '',
				            Message: '',
				            MediaId: 0
				        };

				        if (_oCurrMediaElement != null)
				        {
				            var emailDetails = MPlayerUtils.getResultDetails(_oCurrMediaElement);

				            oData.EmailAddress = $('#emailFriend').val();
				            oData.Message = $('#emailMessage').val();
				            oData.MediaId = emailDetails.mediaId;

				            $.ajax({
				                type: 'POST',
				                url: '/MediaPlayerService.asmx/SendSelection',
				                contentType: 'application/json; charset=utf-8',
				                dataType: 'json',
				                data: $.toJSON(oData),
				                success: function(d)
				                {
				                    var m = d.d;
				                    if (m == true)
				                    {
				                        $('#playlistMsgText').text('Your message has been sent!');
				                        $('#playlistMsgButtonText').text('OK');
				                        $('#playlistMsgButton')
											.unbind('click')
											.click(
												function()
												{
												    MPlayer.showPlaylistTab(sCP);
												}
											);
				                        MPlayer.showPlaylistTab('message');
				                    }
				                    else
				                    {
				                        $('#playlistMsgText').text('There was a problem sending your selection, please try again in a few minutes.');
				                        $('#playlistMsgButtonText').text('OK');
				                        $('#playlistMsgButton')
											.unbind('click')
											.click(
												function()
												{
												    MPlayer.showPlaylistTab(sCP);
												}
											);
				                        MPlayer.showPlaylistTab('message');
				                    }
				                },
				                error: function(xhr, msg)
				                {
				                    $('#playlistMsgText').text('There was a problem sending your selection, please try again in a few minutes.');
				                    $('#playlistMsgButtonText').text('OK');
				                    $('#playlistMsgButton')
										.unbind('click')
										.click(
											function()
											{
											    MPlayer.showPlaylistTab(sCP);
											}
										);
				                    MPlayer.showPlaylistTab('message');
				                }
				            });
				        }
				        else
				        {
				            $('#playlistMsgText').text('Please view a selection to email it to a friend!');
				            $('#playlistMsgButtonText').text('OK');
				            $('#playlistMsgButton')
								.unbind('click')
								.click(
									function()
									{
									    MPlayer.showPlaylistTab(sCP);
									}
								);
				            MPlayer.showPlaylistTab('message');
				        }
				    }


				}
			);
        $('#emailCancel')
			.unbind('click')
			.click(
				function()
				{
				    MPlayer.showPlaylistTab(sCP);
				}
			);
        MPlayer.showPlaylistTab('email');
    }

    function _handleEmbedVideo()
    {
        var sCP = _sCurrPlaylist;
        var mediaDetails = MPlayerUtils.getResultDetails(_oCurrMediaElement);

        $('#embedMessage').val(MPlayerConfig.embedCode.replace(/@MediaId@/g, mediaDetails.mediaId));
        $('#embedClose')
			.unbind('click')
			.click(
				function()
				{
				    MPlayer.showPlaylistTab(sCP);
				}
			);
        MPlayer.showPlaylistTab('embed');
    }

    function _handleFavoritesPermissions()
    {
        if (RolesProvider.isLoggedIn())
        {
            $('#favoritesPlaylist')
				.empty()
				.append($('<div class="playlistContainerCentered"></div>')
					.text('Drag selections here to create a list of media you can access easily later!')
				);
            $('#favoritesAddButton').show();
            $('#emailSelectionButton').show();
            MPlayer.refreshPlaylistDroppable('favorites');
            MPlayer.refreshPlaylistSortable('favorites');
            MPlayer.refreshPlaylistTabDroppable('favorites');

            MPlayerAsync.getFavoritesList();
        }
        else
        {
            $('#favoritesPlaylist')
				.empty()
				.append($('<div class="playlistContainerCentered"></div>')
					.append($('<a></a>')
						.attr('href', MPlayerConfig.registerUrl)
						.text('Register')
					)
					.append(' for an account to create your own favorites list!')
				);
        }
    }

    function _showPlaylistTab(sTab)
    {
        _sCurrPlaylist = sTab;

        $('body').find('.playlistNavContainer .pageTab')
			.addClass('playlistNavItemOff')
			.removeClass('playlistNavItemOn')
			.droppable('enable');
        $('#' + sTab + 'Tab')
			.removeClass('playlistNavItemOff')
			.addClass('playlistNavItemOn')
			.droppable('disable');
        $('body').find('.playlistContainer').hide();
        $('#' + sTab + 'Playlist').show();
    }

    function _showResultsTab(sTab)
    {
        _sCurrResults = sTab;

        $('.resultsMoreContainer').hide();
        $('body').find('.searchResultsNavContainer .pageTab')
			.addClass('searchResultsNavItemOff')
			.removeClass('searchResultsNavItemOn');
        $('#' + sTab + 'Tab')
			.removeClass('searchResultsNavItemOff')
			.addClass('searchResultsNavItemOn');
        $('body').find('.resultsContainer').hide();
        $('#' + sTab + 'Results').show();

        if (($('#' + sTab + 'Count').text() * 1) > MPlayer.resultsCount)
        {
            $('#' + sTab + 'MoreContainer').show();
        }
        else
        {
            $('#' + sTab + 'MoreContainer').hide();
        }
    }

    function _showResultsMessage(sMsg, sTab)
    {
        $('#' + sTab + 'Results')
			.empty()
			.append(
				$('<div class="resultsContainerCentered"></div>')
					.text(sMsg)
			);
    }

    function _refreshPlaylistCount(sPlaylist)
    {
        $('#' + sPlaylist + 'Count')
			.text($('#' + sPlaylist + 'Playlist').find('.playlistItem').length);
    }

    return {
        /* FILE LOCATIONS */
        avResultTnsUrl: '/Thumbnail.aspx?w=94&h=71&img=av_tns/',
        avPlaylistTnsUrl: '/Thumbnail.aspx?w=45&h=34&img=av_tns/',
        /* BINDINGS */
        bindSearchSubmit: function()
        {
            return _bindSearchSubmit();
        },
        /* PLAYER INTERACTION */
        playMediaFromDetails: _playMediaFromDetails,
        playMedia: _playMedia,
        playNextMedia: function()
        {
            // FIND NEXT MEDIA FILE AND PLAY IT
            return _playNextMedia();
        },
        currMediaId: function()
        {
            return _iCurrMediaId;
        },
        getPlayer: function(sId)
        {
            return document.getElementById('avVideoPlayer');
        },
        /* TRASH CAN */
        refreshTrashDroppable: function()
        {
            return _refreshTrashDroppable();
        },
        /* RESULTS */
        resultsCount: 4,
        refreshResultsDraggable: function(sTab)
        {
            return _refreshResultsDraggable(sTab);
        },
        /* PLAYLIST */
        showPlaylistMessage: _showPlaylistMessage,
        appendToPlaylist: function(oEle, sPlaylist)
        {
            return _appendToPlaylist(oEle, sPlaylist);
        },
        refreshPlaylistDraggable: function(sPlaylist)
        {
            return _refreshPlaylistDraggable(sPlaylist);
        },
        refreshPlaylistDroppable: function(sPlaylist)
        {
            return _refreshPlaylistDroppable(sPlaylist);
        },
        refreshPlaylistSortable: function(sPlaylist)
        {
            return _refreshPlaylistSortable(sPlaylist);
        },
        refreshPlayerDroppable: function(sPlaylist)
        {
            return _refreshPlayerDroppable(sPlaylist);
        },
        /* FAVORITES */
        addSelectionToFavorites: function()
        {
            return _addSelectionToFavorites();
        },
        handleEmailSelection: _handleEmailSelection,
        handleEmbedVideo: _handleEmbedVideo,
        handleFavoritesPermissions: function()
        {
            return _handleFavoritesPermissions();
        },
        /* TABS */
        showPlaylistTab: function(sTab)
        {
            return _showPlaylistTab(sTab);
        },
        showResultsTab: function(sTab)
        {
            return _showResultsTab(sTab);
        },
        showResultsMessage: _showResultsMessage,
        refreshPlaylistTabDroppable: function(sPlaylist)
        {
            return _refreshPlaylistTabDroppable(sPlaylist);
        },
        refreshPlaylistCount: function(sPlaylist)
        {
            return _refreshPlaylistCount(sPlaylist);
        }
    };
} ();

var MPlayerAsync = function()
{
    function _playMediaFromId(iId)
    {
        if (iId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetMediaDetails',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: "{'mediaId': " + iId + "}",
                success: function(d)
                {
                    var m = d.d;
                    var plele = MPlayerUtils.createPlaylistObject({
                        mediaId: m.MediaId,
                        fileType: m.FileType,
                        fileName: m.FileName,
                        title: m.Title,
                        subtitle: m.Subtitle,
                        description: m.Description,
                        thumbnailFileName: m.ThumbnailFileName,
                        height: m.Height,
                        width: m.Width,
                        duration: m.Duration,
                        durationText: m.DurationText,
                        authorName: m.AuthorName,
                        authorDescription: m.AuthorDescription
                    });
                    MPlayer.appendToPlaylist(plele, 'nextUp');
                    MPlayer.refreshPlaylistDraggable('nextUp');
                    MPlayer.refreshPlaylistCount('nextUp');

                    MPlayer.playMedia(plele);
                },
                error: function(xhr, msg)
                {
                    // errorcode
                    // Unknown video
                    // TODO: Unable to retrieve media details
                }
            });
        }
    }

    function _getQuickSearchResults(sSearch)
    {
        MPlayer.showResultsTab('search');
        $('#searchMoreContainer > .queryObject').text(sSearch);
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetQuickSearchResults',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: "{'searchValue': '" + sSearch + "', 'resultLimit' : " + MPlayer.resultsCount + "}",
            beforeSend: function(xhr)
            {
                $('#searchResults')
					.empty()
					.append($('<div class="resultsContainerCentered"></div>')
						.text('Searching...')
					);
                $('#searchCount').text('0');
            },
            success: function(d)
            {
                var m = d.d;
                if (m.TotalCount > 0)
                {
                    // First hide the more results link
                    $('#searchMoreContainer').hide();
                    $('#searchCount').text(m.TotalCount);
                    $('#searchResults').empty();
                    for (var i = 0; i < m.MediaFiles.length; i++)
                    {
                        var ele = MPlayerUtils.createResultObject({
                            mediaId: m.MediaFiles[i].MediaId,
                            fileType: m.MediaFiles[i].FileType,
                            fileName: m.MediaFiles[i].FileName,
                            title: m.MediaFiles[i].Title,
                            subtitle: m.MediaFiles[i].Subtitle,
                            description: m.MediaFiles[i].Description,
                            thumbnailFileName: m.MediaFiles[i].ThumbnailFileName,
                            height: m.MediaFiles[i].Height,
                            width: m.MediaFiles[i].Width,
                            duration: m.MediaFiles[i].Duration,
                            durationText: m.MediaFiles[i].DurationText,
                            authorName: m.MediaFiles[i].AuthorName,
                            authorDescription: m.MediaFiles[i].AuthorDescription
                        });
                        $('#searchResults').append(ele);
                    }
                    if (m.TotalCount > MPlayer.resultsCount)
                    {
                        $('#searchMoreLink')
							.unbind('click')
							.click(function()
							{
							    MPlayerAsync.getQuickSearchResultsOverlay(
									$(this).siblings('.queryObject').text());
							    return false;
							});
                        $('#searchMoreContainer').show();
                    }

                    MPlayer.refreshResultsDraggable('search');
                }
                else
                {
                    $('#searchMoreContainer').hide();
                    $('#searchResults').empty();
                    $('#searchCount').text('0');
                    $('#searchResults')
						.append($('<div class="resultsContainerCentered"></div>')
							.text('No results were found!')
						);
                }
            },
            error: function(xhr, msg)
            {
                MPlayer.showResultsMessage('There was a problem retrieving your search results, please try again shortly.', 'search');
            }
        });
    }

    function _getQuickSearchResultsOverlay(sSearch)
    {
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetQuickSearchResults',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: "{'searchValue': '" + sSearch + "', 'resultLimit' : 200}",
            success: function(d)
            {
                var m = d.d;
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty();
                /*.append(SearchUtils.createHeaderObject({
                text: 'Search results for "' + sSearch + '":'
                }));*/
                MPlayerOverlay.show()

                if (m.TotalCount > 0)
                {
                    for (var i = 0; i < m.MediaFiles.length; i++)
                    {
                        $(sele)
							.append(SearchUtils.createMediaResultObject({
							    mediaId: m.MediaFiles[i].MediaId,
							    authorName: m.MediaFiles[i].AuthorName,
							    title: m.MediaFiles[i].Title,
							    description: m.MediaFiles[i].Description,
							    durationText: m.MediaFiles[i].DurationText,
							    titleClick: _getQuickSearchResultsOverlay_PlaylistClick,
							    playlistClick: _getQuickSearchResultsOverlay_PlaylistClick,
							    watchClick: _getQuickSearchResultsOverlay_WatchClick,
							    fileType: m.MediaFiles[i].FileType
							}));
                    }
                }
                else
                {
                    $(sele)
						.append($('<div class="searchOverlayCentered"></div>')
							.text('No results found!')
						);
                }
            },
            error: function(xhr, msg)
            {
                // Error on overlay
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty();
                /*.append(SearchUtils.createHeaderObject({
                text: 'Search results for "' + sSearch + '":'
                }));*/
                MPlayerOverlay.show()

                $(sele)
					.append($('<div class="searchOverlayCentered"></div>')
						.text('There was a problem retrieving your search results, please try again shortly.')
					);
            }
        });
    }

    function _getQuickSearchResultsOverlay_PlaylistClick(e)
    {
        var details = SearchUtils.getMediaResultObjectDetails($(e.target).parent().parent());
        if (details.mediaId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetMediaDetails',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: "{'mediaId': " + details.mediaId + "}",
                success: function(d)
                {
                    var m = d.d;
                    var plele = MPlayerUtils.createPlaylistObject({
                        mediaId: m.MediaId,
                        fileType: m.FileType,
                        fileName: m.FileName,
                        title: m.Title,
                        subtitle: m.Subtitle,
                        description: m.Description,
                        thumbnailFileName: m.ThumbnailFileName,
                        height: m.Height,
                        width: m.Width,
                        duration: m.Duration,
                        durationText: m.DurationText,
                        authorName: m.AuthorName,
                        authorDescription: m.AuthorDescription
                    });
                    MPlayer.appendToPlaylist(plele, 'nextUp');
                    MPlayer.refreshPlaylistDraggable('nextUp');
                    MPlayer.refreshPlaylistCount('nextUp');

                    MPlayerOverlay.showMessage('The selection has been added to your playlist!');

                },
                error: function(xhr, msg)
                {
                    MPlayerOverlay.showMessage('There was a problem retrieving your selection\'s details, please try again shortly.');
                }
            });
        }
        return false;
    }

    function _getQuickSearchResultsOverlay_WatchClick(e)
    {
        var details = SearchUtils.getMediaResultObjectDetails($(e.target).parent().parent());
        if (details.mediaId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetMediaDetails',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: "{'mediaId': " + details.mediaId + "}",
                success: function(d)
                {
                    var m = d.d;
                    MPlayerOverlay.hide();
                    if ($.browser.mozilla)
                    {
                        /* GET RID OF THIS WHEN FIREFOX FIXES BUG! */
                        /* Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=451816 */
                        setTimeout((function(m)
                        {
                            return function()
                            {
                                MPlayer.playMediaFromDetails({
                                    mediaId: m.MediaId,
                                    fileType: m.FileType,
                                    fileName: m.FileName,
                                    title: m.Title,
                                    subtitle: m.Subtitle,
                                    description: m.Description,
                                    thumbnailFileName: m.ThumbnailFileName,
                                    height: m.Height,
                                    width: m.Width,
                                    duration: m.Duration,
                                    durationText: m.DurationText,
                                    authorName: m.AuthorName,
                                    authorDescription: m.AuthorDescription
                                });
                            }
                        })(m), 1000);
                    }
                    else
                    {
                        MPlayer.playMediaFromDetails({
                            mediaId: m.MediaId,
                            fileType: m.FileType,
                            fileName: m.FileName,
                            title: m.Title,
                            subtitle: m.Subtitle,
                            description: m.Description,
                            thumbnailFileName: m.ThumbnailFileName,
                            height: m.Height,
                            width: m.Width,
                            duration: m.Duration,
                            durationText: m.DurationText,
                            authorName: m.AuthorName,
                            authorDescription: m.AuthorDescription
                        });
                    }
                },
                error: function(xhr, msg)
                {
                    MPlayerOverlay.showMessage('There was a problem retrieving your selection\'s details, please try again shortly.');
                }
            });
        }
        return false;
    }

    function _getSameContentResults(mediaId, sType)
    {
        var t = '';

        switch (sType.toLowerCase())
        {
            case 'speaker':
                sType = 'Speaker';
                t = 'sameSpeaker';
                break;
            case 'topic':
                sType = 'Topic';
                t = 'sameTopics';
                break;
            case 'passage':
                sType = 'Passage';
                t = 'samePassage';
                break;
        }

        $('#' + t + 'MoreContainer > .queryObject').text(mediaId);
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetRelated' + sType + 'Content',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: "{'mediaId': '" + mediaId + "', 'resultLimit' : " + MPlayer.resultsCount + "}",
            beforeSend: function(xhr)
            {
                $('#' + t + 'Results')
					.empty()
					.append($('<div class="resultsContainerCentered"></div>')
						.text('Searching...')
					)
                $('#' + t + 'Count').text('0');
            },
            success: function(d)
            {
                var m = d.d;
                if (m.TotalCount > 0)
                {
                    // First hide the more results link
                    $('#' + t + 'MoreContainer').hide();
                    $('#' + t + 'Count').text(m.TotalCount);
                    $('#' + t + 'Results').empty();
                    for (var i = 0; i < m.MediaFiles.length; i++)
                    {
                        var ele = MPlayerUtils.createResultObject({
                            mediaId: m.MediaFiles[i].MediaId,
                            fileType: m.MediaFiles[i].FileType,
                            fileName: m.MediaFiles[i].FileName,
                            title: m.MediaFiles[i].Title,
                            subtitle: m.MediaFiles[i].Subtitle,
                            description: m.MediaFiles[i].Description,
                            thumbnailFileName: m.MediaFiles[i].ThumbnailFileName,
                            height: m.MediaFiles[i].Height,
                            width: m.MediaFiles[i].Width,
                            duration: m.MediaFiles[i].Duration,
                            durationText: m.MediaFiles[i].DurationText,
                            authorName: m.MediaFiles[i].AuthorName,
                            authorDescription: m.MediaFiles[i].AuthorDescription
                        });
                        $('#' + t + 'Results').append(ele);
                    }
                    if (m.TotalCount > MPlayer.resultsCount)
                    {
                        $('#' + t + 'MoreLink')
							.unbind('click')
							.click(function()
							{
							    MPlayerAsync.getSameContentResultsOverlay(
									$(this).siblings('.queryObject').text(), sType);
							    return false;
							});
                        if ($('#' + t + 'Tab').hasClass('searchResultsNavItemOn'))
                            $('#' + t + 'MoreContainer').show();
                        else
                            $('#' + t + 'MoreContainer').hide();

                    }

                    MPlayer.refreshResultsDraggable(t);
                }
                else
                {
                    $('#' + t + 'MoreContainer').hide();
                    $('#' + t + 'Results').empty();
                    $('#' + t + 'Count').text('0');
                    $('#' + t + 'Results')
						.append($('<div class="resultsContainerCentered"></div>')
							.text('No results were found!')
						);
                }
            },
            error: function(xhr, msg)
            {
                MPlayer.showResultsMessage('There was a problem retrieving the related information, please try again shortly.', t)
            }
        });
    }

    function _getSameContentResultsOverlay(mediaId, sType)
    {
        var t = '';

        switch (sType.toLowerCase())
        {
            case 'speaker':
                sType = 'Speaker';
                t = 'sameSpeaker';
                break;
            case 'topic':
                sType = 'Topic';
                t = 'sameTopics';
                break;
            case 'passage':
                sType = 'Passage';
                t = 'samePassage';
                break;
        }

        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetRelated' + sType + 'Content',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: "{'mediaId': '" + mediaId + "', 'resultLimit' : 0}",
            success: function(d)
            {
                var m = d.d;
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty();
                /*.append(SearchUtils.createHeaderObject({
                text: 'Search results for "' + sSearch + '":'
                }));*/
                MPlayerOverlay.show()

                if (m.TotalCount > 0)
                {
                    for (var i = 0; i < m.MediaFiles.length; i++)
                    {
                        $(sele)
							.append(SearchUtils.createMediaResultObject({
							    mediaId: m.MediaFiles[i].MediaId,
							    authorName: m.MediaFiles[i].AuthorName,
							    title: m.MediaFiles[i].Title,
							    description: m.MediaFiles[i].Description,
							    durationText: m.MediaFiles[i].DurationText,
							    titleClick: _getSameContentResultsOverlay_PlaylistClick,
							    playlistClick: _getSameContentResultsOverlay_PlaylistClick,
							    watchClick: _getSameContentResultsOverlay_WatchClick,
							    fileType: m.MediaFiles[i].FileType
							}));
                    }
                }
                else
                {
                    $(sele)
						.append($('<div class="searchOverlayCentered"></div>')
							.text('No results found!')
						);
                }
            },
            error: function(xhr, msg)
            {
                // Error on overlay
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty();
                /*.append(SearchUtils.createHeaderObject({
                text: 'Search results for "' + sSearch + '":'
                }));*/
                MPlayerOverlay.show()

                $(sele)
					.append($('<div class="searchOverlayCentered"></div>')
						.text('There was a problem retrieving your search results, please try again shortly.')
					);
            }
        });
    }

    function _getSameContentResultsOverlay_PlaylistClick(e)
    {
        var details = SearchUtils.getMediaResultObjectDetails($(e.target).parent().parent());
        if (details.mediaId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetMediaDetails',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: "{'mediaId': " + details.mediaId + "}",
                success: function(d)
                {
                    var m = d.d;
                    var plele = MPlayerUtils.createPlaylistObject({
                        mediaId: m.MediaId,
                        fileType: m.FileType,
                        fileName: m.FileName,
                        title: m.Title,
                        subtitle: m.Subtitle,
                        description: m.Description,
                        thumbnailFileName: m.ThumbnailFileName,
                        height: m.Height,
                        width: m.Width,
                        duration: m.Duration,
                        durationText: m.DurationText,
                        authorName: m.AuthorName,
                        authorDescription: m.AuthorDescription
                    });
                    MPlayer.appendToPlaylist(plele, 'nextUp');
                    MPlayer.refreshPlaylistDraggable('nextUp');
                    MPlayer.refreshPlaylistCount('nextUp');

                    MPlayerOverlay.showMessage('The selection has been added to your playlist!');

                },
                error: function(xhr, msg)
                {
                    MPlayerOverlay.showMessage('There was a problem retrieving your selection\'s details, please try again shortly.');
                }
            });
        }
        return false;
    }

    function _getSameContentResultsOverlay_WatchClick(e)
    {
        var details = SearchUtils.getMediaResultObjectDetails($(e.target).parent().parent());
        if (details.mediaId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetMediaDetails',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: "{'mediaId': " + details.mediaId + "}",
                success: function(d)
                {
                    var m = d.d;
                    MPlayerOverlay.hide();
                    if ($.browser.mozilla)
                    {
                        /* GET RID OF THIS WHEN FIREFOX FIXES BUG! */
                        /* Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=451816 */
                        setTimeout((function(m)
                        {
                            return function()
                            {
                                MPlayer.playMediaFromDetails({
                                    mediaId: m.MediaId,
                                    fileType: m.FileType,
                                    fileName: m.FileName,
                                    title: m.Title,
                                    subtitle: m.Subtitle,
                                    description: m.Description,
                                    thumbnailFileName: m.ThumbnailFileName,
                                    height: m.Height,
                                    width: m.Width,
                                    duration: m.Duration,
                                    durationText: m.DurationText,
                                    authorName: m.AuthorName,
                                    authorDescription: m.AuthorDescription
                                });
                            }
                        })(m), 1000);
                    }
                    else
                    {
                        MPlayer.playMediaFromDetails({
                            mediaId: m.MediaId,
                            fileType: m.FileType,
                            fileName: m.FileName,
                            title: m.Title,
                            subtitle: m.Subtitle,
                            description: m.Description,
                            thumbnailFileName: m.ThumbnailFileName,
                            height: m.Height,
                            width: m.Width,
                            duration: m.Duration,
                            durationText: m.DurationText,
                            authorName: m.AuthorName,
                            authorDescription: m.AuthorDescription
                        });
                    }
                },
                error: function(xhr, msg)
                {
                    MPlayerOverlay.showMessage('There was a problem retrieving your selection\'s details, please try again shortly.');
                }
            });
        }
        return false;
    }

    function _getArticlesOverlay(mediaId)
    {
        if (mediaId > 0)
        {
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetRelatedArticlesContent',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: '{"contentId": ' + mediaId + ', "resultLimit": 0}',
                success: function(d)
                {
                    var m = d.d;
                    var sele = MPlayerOverlay.getContent();
                    $(sele)
						.empty()
						.append(SearchUtils.createHeaderObject({
						    text: 'Articles related to the current selection:'
						}));
                    MPlayerOverlay.show()

                    if (m.TotalCount > 0)
                    {
                        for (var i = 0; i < m.ContentItems.length; i++)
                        {
                            $(sele)
								.append(SearchUtils.createArticleResultObject({
								    contentId: m.ContentItems[i].ContentId,
								    authorName: m.ContentItems[i].AuthorName,
								    title: m.ContentItems[i].Title,
								    description: m.ContentItems[i].Description,
								    linkText: 'READ ARTICLE',
								    click: _getArticleResultsOverlay_Click
								}));
                        }
                    }
                    else
                    {
                        $(sele)
							.append($('<div class="searchOverlayCentered"></div>')
								.text('No results found!')
							);
                    }
                },
                error: function(xhr, msg)
                {
                    var sele = MPlayerOverlay.getContent();
                    $(sele)
						.empty()
						.append(SearchUtils.createHeaderObject({
						    text: 'Articles related to the current selection:'
						}));
                    MPlayerOverlay.show()
                    $(sele)
						.append($('<div class="searchOverlayCentered"></div>')
							.text('There was a problem retrieving the related articles, please try again shortly.')
						);
                }
            });
        }
    }
    function _getArticleResultsOverlay_Click(e)
    {
        var details = SearchUtils.getArticleResultObjectDetails($(e.target).parent().parent());
        if (details.contentId > 0)
        {
            window.location = MPlayerConfig.articleUrl + details.contentId;
        }
        return false;
    }

    function _getSuggestedPlaylistOverlay()
    {
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetSuggestedPlaylists',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: '{}',
            success: function(d)
            {
                var m = d.d;
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty()
					.append(SearchUtils.createHeaderObject({
					    text: 'Playlists we recommend:'
					}));
                MPlayerOverlay.show();

                if (m.length > 0)
                {
                    for (var i = 0; i < m.length; i++)
                    {
                        $(sele)
							.append(SearchUtils.createArticleResultObject({
							    contentId: m[i].ContentId,
							    authorName: '',
							    title: m[i].Name,
							    description: m[i].Description,
							    linkText: 'WATCH PLAYLIST',
							    click: _getSuggestedPlaylistOverlay_Click
							}));
                    }
                }
                else
                {
                    $(sele)
						.append($('<div class="searchOverlayCentered"></div>')
							.text('No results found!')
						);
                }
            },
            error: function(xhr, msg)
            {
                var sele = MPlayerOverlay.getContent();
                $(sele)
					.empty()
					.append(SearchUtils.createHeaderObject({
					    text: 'Playlists we recommend:'
					}));
                MPlayerOverlay.show();

                $(sele)
					.append($('<div class="searchOverlayCentered"></div>')
						.text('There was a problem retrieving the suggested playlists, please try again shortly.')
					);
            }
        });
    }
    function _getSuggestedPlaylistOverlay_Click(e)
    {
        var details = SearchUtils.getArticleResultObjectDetails($(e.target).parent().parent());
        if (details.contentId > 0)
        {
            // Empty current playlist and populate it with the clicked one
            $.ajax({
                type: 'POST',
                url: '/MediaPlayerService.asmx/GetSuggestedPlaylistMedia',
                contentType: 'application/json; charset=utf-8',
                dataType: 'json',
                data: '{"contentId": ' + details.contentId + ', "resultLimit": 0}',
                success: function(d)
                {
                    var m = d.d;
                    $('#nextUpPlaylist').empty();

                    if (m.MediaFiles.length > 0)
                    {
                        var firstItem = null;
                        for (var i = 0; i < m.MediaFiles.length; i++)
                        {
                            var ele = MPlayerUtils.createPlaylistObject({
                                mediaId: m.MediaFiles[i].MediaId,
                                fileType: m.MediaFiles[i].FileType,
                                fileName: m.MediaFiles[i].FileName,
                                title: m.MediaFiles[i].Title,
                                subtitle: m.MediaFiles[i].Subtitle,
                                description: m.MediaFiles[i].Description,
                                thumbnailFileName: m.MediaFiles[i].ThumbnailFileName,
                                height: m.MediaFiles[i].Height,
                                width: m.MediaFiles[i].Width,
                                duration: m.MediaFiles[i].Duration,
                                durationText: m.MediaFiles[i].DurationText,
                                authorName: m.MediaFiles[i].AuthorName,
                                authorDescription: m.MediaFiles[i].AuthorDescription
                            });
                            MPlayer.appendToPlaylist(ele, 'nextUp');

                            if (i == 0)
                            {
                                // Save a reference to the first item so we can start playing it
                                firstItem = ele;
                            }
                        }

                        MPlayerOverlay.hide();

                        MPlayer.playMedia(firstItem);
                    }
                    else
                    {
                        // Empty playlist!
                    }
                },
                error: function(xhr, msg)
                {
                    MPlayerOverlay.showMessage('There was a problem retrieving the collection\'s information, please try again shortly');
                }
            });
        }
        return false;
    }

    function _getFavoritesList()
    {
        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/GetFavoritesList',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: "{}",
            success: function(d)
            {
                var m = d.d;
                for (var i = 0; i < m.d.MediaFiles.length; i++)
                {
                    var ele = MPlayerUtils.createPlaylistObject({
                        mediaId: m.d.MediaFiles[i].MediaId,
                        fileType: m.d.MediaFiles[i].FileType,
                        fileName: m.d.MediaFiles[i].FileName,
                        title: m.d.MediaFiles[i].Title,
                        subtitle: m.d.MediaFiles[i].Subtitle,
                        description: m.d.MediaFiles[i].Description,
                        thumbnailFileName: m.d.MediaFiles[i].ThumbnailFileName,
                        height: m.d.MediaFiles[i].Height,
                        width: m.d.MediaFiles[i].Width,
                        duration: m.d.MediaFiles[i].Duration,
                        durationText: m.d.MediaFiles[i].DurationText,
                        authorName: m.d.MediaFiles[i].AuthorName,
                        authorDescription: m.d.MediaFiles[i].AuthorDescription
                    });
                    MPlayer.appendToPlaylist(ele, 'favorites');
                }
            },
            error: function(xhr, msg)
            {
                MPlayer.showPlaylistMessage('There was a problem retrieving your favorites list, please try again shortly.');
            }
        });
    }

    function _persistFavoritesList()
    {
        var strData = '';
        var favs = $('#favoritesPlaylist').find('.playlistItem');

        strData += '{\"__type\": \"ChurchesofChrist.Shared.MediaList\", ';
        strData += '\"MediaFiles\": [ ';

        for (var i = 0; i < favs.length; i++)
        {
            strData += MPlayerUtils.getPlaylistDetailsJSON(favs[i]);
            if ((i + 1) < favs.length)
            {
                strData += ', ';
            }
        }

        strData += ' ], ';
        strData += '\"TotalCount\": ' + favs.length + ' ';
        strData += '}';

        $.ajax({
            type: 'POST',
            url: '/MediaPlayerService.asmx/PersistFavoritesList',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: '{\"mediaList\": ' + strData + '}',
            success: function(msg)
            {
                // Persisted
            },
            error: function(xhr, msg)
            {
                // TODO: Problem saving favorites list.
            }
        });
    }

    return {
        /* PLAYER */
        playMediaFromId: _playMediaFromId,
        /* QUICK SEARCH */
        getQuickSearchResults: function(sSearch)
        {
            return _getQuickSearchResults(sSearch);
        },
        getQuickSearchResultsOverlay: function(sSearch)
        {
            return _getQuickSearchResultsOverlay(sSearch);
        },
        /* SAME CONTENT */
        getSameContentResults: function(mediaId, sType)
        {
            return _getSameContentResults(mediaId, sType);
        },
        getSameContentResultsOverlay: function(mediaId, sType)
        {
            return _getSameContentResultsOverlay(mediaId, sType);
        },
        /* ARTICLES */
        getArticlesOverlay: _getArticlesOverlay,
        getSuggestedPlaylistOverlay: _getSuggestedPlaylistOverlay,
        /* FAVORITES LIST */
        getFavoritesList: function()
        {
            return _getFavoritesList();
        },
        persistFavoritesList: function()
        {
            return _persistFavoritesList();
        }
    };
} ();