$(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(m)
			{
				$('#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;
						}
					}
					
					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(m)
				                {
				                    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(m)
				{
					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(m)
			{
				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(m)
			{
				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(m)
				{
					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(m)
				{
					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(m)
			{
				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(m)
			{
				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(m)
				{
					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(m)
				{
					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(m)
				{
					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(m)
			{
				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(m)
				{
					$('#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(m)
			{
				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, '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();
		}
	};
}();