A fix for TIVI-2514, blank items in the list index. Checks that the album image...
[profile/ivi/MediaPlayer.git] / js / main.js
index 5124c12..3f27f62 100644 (file)
@@ -16,37 +16,32 @@ var screenOrientation;
 var iconWidth;
 var padding;
 var contentType = "AUDIO";
-var audioContent = new Array();
-var videoContent = new Array();
-var imageContent = new Array();
-var currentContent;
 var currentPlayer;
-var currentPlayerType = "AUDIO";
 var currentMediaList = $("#audioMediaList");
-var currentMediaListItems = $("#audioMediaListItems");
-var currentPlayerControls;
 var audioMediaListLoaded = false;
 var videoMediaListLoaded = false;
 var imageMediaListLoaded = false;
 var audioPlayer;
 var videoPlayer;
-var audioIndex = 0;
-var videoIndex = 0;
-var imageIndex = 0;
+var imagePlayer;
 var vidIcon = new Image();
 var imgIcon = new Image();
 var musicIcon = new Image();
 var imagesLoaded = false;
 var mediaListItemW;
 var mediaListItemH;
-var imageControls;
-var loadAndPlay = false;
-var currentFileLoaded = false;
+var playOnConnect = false;
 var mediaNameCanvas;
 var mediaNameCTX;
+var trackTimeCanvas;
+var trackTimeCTX;
 var speechObj;
 var nightMode = false;
 var waitingToResumeVideo = false;              //Media has been paused by exterior forces.  If set to true, resume previous media when given the signal.
+var stopServerSearch;
+var playBarHeight;
+var boxWidth;
+var textStartX;
 
 var mainMenuTitleTemplateLandscape = {"font" : "oblique bolder 30pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
                "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
@@ -60,6 +55,9 @@ var mainTrackTemplateLandscape = {"font" : "bold 20pt Arial", "lineWidth" : 7.5,
 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
                "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
 
+var timeTemplate = {"font" : "bold 25pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
+               "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
+
 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
                "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
 
@@ -67,10 +65,10 @@ var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillSt
 
 var trackTextTemplate  = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
 
-var mediaTextTemplate2Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
+var mediaTextTemplate2Landscape = {"font" : "bold 13pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
                "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
 
-var mediaTextTemplate3Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
+var mediaTextTemplate3Landscape = {"font" : "bold 13pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
 
 var trackTextTemplateLandscape  = {"font" : "bold 11pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
 
@@ -151,191 +149,97 @@ function setupSpeech()
 
 }
 
-function updateMediaName(newArtist, newTitle, newCover)
+function onAudioContentLoaded(newContent)
 {
-       if (currentMenu === "audio")
+       if (!newContent || newContent.length === 0)
        {
-               var playBarHeight = mediaNameCanvas.height;
-               var boxWidth = playBarHeight * 0.75;
-               mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
-
-               if (currentPlayerType === "AUDIO")
-               {
-                       var shadeJump = 10;
-                       var alphaJump = 0.01;
-                       var currColor = 255;
-                       var currAlpha = 1.0;
-
-                       mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
-                       mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
-                       mediaNameCTX.lineWidth = 5;
-                       mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
-                       mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
-
-                       if (newCover === undefined || newCover.naturalWidth === undefined || newCover.naturalWidth <= 0)
-                       {
-                               newCover = musicIcon;
-                       }
-
-                       mediaNameCTX.drawImage(newCover, 20, (playBarHeight - boxWidth) / 2, boxWidth, boxWidth);
-
-                       if (screenOrientation === "portrait")
-                       {
-                               var textStartX = boxWidth + 50;
-
-                               var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0,
-                                                                       "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 65, "wordWrap" : true});
-                               trackText.applyTemplate(mainMenuTitleTemplate);
-
-                               var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 70, "zLoc" : 0,
-                                                                               "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
-                               artistText.applyTemplate(mainTrackTemplate);
-                       }
-                       else
-                       {
-                               var textStartX = boxWidth + 50;
-                               var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 50 , "zLoc" : 0,
-                                                                               "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
-                               trackText.applyTemplate(mainMenuTitleTemplateLandscape);
-                               var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0,
-                                                                               "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
-                               artistText.applyTemplate(mainTrackTemplateLandscape);
-                       }
-
-                       trackText.drawObj();
-                       trackText.drawLargeShadow();
-
-                       artistText.yLoc += trackText.height;
-                       artistText.drawObj();
-               }
+               console.log("MediaPlayer: some content failed to load, trying again for " + audioPlayer.type);
+               audioPlayer.clearContent();
+               setTimeout(function(){getMedia(onAudioContentLoaded, "AUDIO");}, 3000);
+               return;
+       }
+       else
+       {
+               audioPlayer.updateContent(newContent, true);
+               audioPlayer.onContentLoaded();
        }
 }
 
-function onContentItemArraySuccess(content)
+function onVideoContentLoaded(newContent)
 {
-       console.log("MediaPlayer in onContentItemArraySuccess");
-       var emptyContent = true;
-
-       if (!content || content === undefined || content.length <= 0)
-               console.log("Invalid content for " + contentType);
+       if (!newContent || newContent.length === 0)
+       {
+               console.log("MediaPlayer: some content failed to load, trying again for " + videoPlayer.type);
+               videoPlayer.clearContent();
+               setTimeout(function(){getMedia(onVideoContentLoaded, "VIDEO");}, 3000);
+               return;
+       }
        else
        {
-               emptyContent = false;
+               videoPlayer.updateContent(newContent, true);
+               videoPlayer.onContentLoaded();
        }
+}
 
-       switch (contentType)
+function onImageContentLoaded(newContent)
+{
+       if (!newContent || newContent.length === 0)
        {
-       case "AUDIO":
-
-                       if (!emptyContent)
-                       {
-                               try
-                               {
-                                       audioContent = audioContent.concat(content);
-
-                                       $("#audioSrc").attr("src", audioContent[0].contentURI);
-                                       audioPlayer.load();
-
-                                       var imgSources = [];
-                                       for (var i = 0; i < audioContent.length; i++)
-                                       {
-                                               var iconURI = (audioContent[i].thumbnailURIs !== undefined && audioContent[i].thumbnailURIs !== null) ? audioContent[i].thumbnailURIs[0] : "images/musicIcon.png";
-                                               audioContent[i].coverArtURI = iconURI;
-                                       }
-
-                                       loadImages();
-
-                                       audioMediaListLoaded = true;
-                                       currentMediaListItems = $("#audioMediaListItems");
-                                       fillMediaList(audioContent);
-                               }
-
-                               catch (err)
-                               {
-                                       console.log("Error when parsing audioContent");
-                               }
-                       }
-
-               contentType = "VIDEO";
-               break;
-
-       case "VIDEO":
-               if (!emptyContent)
-               {
-                       videoContent = videoContent.concat(content);
-                       $("#videoSrc").attr("src", videoContent[0].contentURI);
-               }
-               contentType = "IMAGE";
-               break;
-
-       case "IMAGE":
-               if (!emptyContent)
-               {
-                       imageContent = imageContent.concat(content);
-                       $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
-                       $("#imagePlayer").css("background-size", "contain");
-               }
-               contentType = undefined;
-               break;
-
-       default:
-               console.log("Undefined content search type");
-       nextContentType = undefined;
-       break;
+               console.log("MediaPlayer: some content failed to load, trying again for " + imagePlayer.type);
+               imagePlayer.clearContent();
+               setTimeout(function(){getMedia(onImageContentLoaded, "IMAGE");}, 3000);
+               return;
+       }
+       else
+       {
+               imagePlayer.updateContent(newContent, true);
+               imagePlayer.onContentLoaded();
        }
-
-       if (contentType !== undefined)
-               getMedia(contentType);
 }
 
-function getMedia(mediaType)
+function getMedia(callback, filterType)
 {
        console.log("MediaPlayer in getMedia");
        var manager = tizen.content;
-
-       var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
-       manager.find(onContentItemArraySuccess, onError, null, filter);
+       if (manager)
+       {
+               var filter = new tizen.AttributeFilter("type", "EXACTLY", filterType);
+               manager.find(callback, onError, null, filter);
+       }
+       else
+               console.log("MediaPlayer failed to receive media, tizen.content is unavailable");
 }
 
 function showMediaMenu()
 {
        console.log("MediaPlayer in showMediaMenu");
-       $(".navButton").fadeIn(800);
+       $(".navButton").show();
 
-       switch(currentPlayerType)
+       switch(currentPlayer.type)
        {
-               case "AUDIO":
-                       //show audio player
-                       try
-                       {
-                               if (audioContent.length > 0)
-                                       updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
-                       }
-                       catch(err)
-                       {
-                               console.log("updateMediaName failed for showMediaMenu (audio) : " + err.message);
-                       }
-
-                       $("#mediaName").fadeIn(800);
-                       $(".sortButton").fadeIn(800);
-                       currentPlayer.fadeIn(800);
+               case "audio":
+                       $("#mediaName").show();
+                       $("#trackTime").show();
+                       $(".sortButton").show();
+                       currentPlayer.show();
 
                        if (screenOrientation === "landscape" )
                                $("#audioMediaList").addClass("landscape");
                        else
                                $("#audioMediaList").removeClass("landscape");
 
-                       $("#audioMediaList").fadeIn(800);
+                       $("#audioMediaList").show();
                        break;
 
-               case "VIDEO":
+               case "video":
                        //show video
-                       setTimeout(function(){currentPlayer.show()}, 800);              //The video element can't be faded, so wait a moment before showing
+                       currentPlayer.show();
+                       //setTimeout(function(){currentPlayer.show()}, 800);            //The video element can't be faded, so wait a moment before showing
                        break;
 
-               case "IMAGE":
+               case "image":
                        //show image
-                       currentPlayer.fadeIn(800);
+                       currentPlayer.show();
                        break;
 
                default:
@@ -349,10 +253,10 @@ function showMediaList()
        console.log("MediaPlayer in showMediaList");
 
        if (currentMediaList.is(":visible"))
-               currentMediaList.fadeOut(300);
+               currentMediaList.hide();
        else
        {
-               currentMediaList.fadeIn(300);
+               currentMediaList.show();
        }
 }
 
@@ -365,6 +269,7 @@ function changeMenu(menuButtonId)
        var buttonBottom = clickedButton.css("bottom");
        var buttonRight  = clickedButton.css("right");
 
+/*
        //Animate the clicked button slightly
        clickedButton.animate({
                bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
@@ -383,23 +288,29 @@ function changeMenu(menuButtonId)
                        clickedButton.css({"bottom": buttonBottom});
        }
        );
-
-       $(".mainButton").fadeOut(300);
+*/
+       $(".mainButton").hide();
 
        switch(menuButtonId)
        {
                case ("mainMusicButton"):
                        speechObj.vocalizeString("Music player");
                        currentMenu = "audio";
-                       currentPlayer = $("#audioPlayer");
-                       currentPlayerControls = document.getElementById("audioPlayer");
-                       currentPlayerType = "AUDIO";
+                       currentPlayer = audioPlayer;
                        currentMediaList = $("#audioMediaList");
-                       currentMediaListItems = $("#audioMediaListItems");
-                       currentContent = audioContent;
+                       localStorage.prevMenu = "mainMusicButton";
+
+                       if (audioPlayer.currentAudioContent && audioPlayer.currentAudioContent.contentURI)
+                       {
+                               localStorage.prevAudioTrack = audioPlayer.currentAudioContent.contentURI
+                               localStorage.prevAudioTime = audioPlayer.playerControls.currentTime;
+                       }
+
+                       localStorage.prevVideo = undefined;
+                       localStorage.prevVideoTime = undefined;
 
                        if (!audioMediaListLoaded)
-                               fillMediaList(currentContent);
+                               audioPlayer.fillMediaList();
 
                        showMediaMenu();
                break;
@@ -407,15 +318,21 @@ function changeMenu(menuButtonId)
                case ("mainVideoButton"):
                        speechObj.vocalizeString("Video player");
                        currentMenu = "video";
-                       currentPlayer = $("#videoPlayer");
-                       currentPlayerControls = document.getElementById("videoPlayer");
-                       currentPlayerType = "VIDEO";
+                       currentPlayer = videoPlayer;
                        currentMediaList = $("#videoMediaList");
-                       currentMediaListItems = $("#videoMediaListItems");
-                       currentContent = videoContent;
+                       localStorage.prevMenu = "mainVideoButton";
+
+                       if (videoPlayer.currentVideoContent && videoPlayer.currentVideoContent.contentURI)
+                       {
+                               localStorage.prevVideo = videoPlayer.currentVideoContent.contentURI
+                               localStorage.prevVideoTime = videoPlayer.playerControls.currentTime;
+                       }
+
+                       localStorage.prevAudioTime = undefined;
+                       localStorage.prevAudioTrack = undefined;
 
                        if (!videoMediaListLoaded)
-                               fillMediaList(currentContent);
+                               videoPlayer.fillMediaList();
 
                        showMediaMenu();
                break;
@@ -423,15 +340,12 @@ function changeMenu(menuButtonId)
                case ("mainImageButton"):
                        speechObj.vocalizeString("Picture viewer");
                        currentMenu = "image";
-                       currentPlayer = $("#imagePlayer");
-                       currentPlayerControls = imageControls;
-                       currentPlayerType = "IMAGE";
+                       currentPlayer = imagePlayer;
                        currentMediaList = $("#imageMediaList");
-                       currentMediaListItems = $("#imageMediaListItems");
-                       currentContent = imageContent;
+                       localStorage.prevMenu = "mainImageButton";
 
                        if (!imageMediaListLoaded)
-                               fillMediaList(currentContent);
+                               imagePlayer.fillMediaList();
 
                        showMediaMenu();
                break;
@@ -443,103 +357,43 @@ function changeMenu(menuButtonId)
 
 function showMainMenu()
 {
-       console.log("MediaPlayer in showMainMenu");
+       console.log("MediaPlayer in showMainMenu, clearing all localStorage...");
        currentMenu = "main";
-       currentPlayerControls.pause();
+       localStorage.prevMenu = "MAIN";
+       localStorage.prevAudioTime = undefined;
+       localStorage.prevAudioTrack = undefined;
+       localStorage.prevVideo = undefined;
+       localStorage.prevVideoTime = undefined;
+       localStorage.prevImage = undefined;
 
-       $("#playButton").toggleClass('playing', false);
+       currentPlayer.pause();
 
        //If the media list is showing, hide it.  Remove the mediaListAudioList class if it exists so that it will resize properly
        if (currentMediaList.is(":visible"))
-               currentMediaList.fadeOut(300);
-
-       $(".navButton").fadeOut(300);
-       $(".sortButton").fadeOut(300);
-       $("#mediaName").fadeOut(300);
-
-       if (currentPlayerType !== "VIDEO")
-               currentPlayer.fadeOut(300);
-       else
-               currentPlayer.hide();
-
+               currentMediaList.hide();
 
+       $(".navButton").hide();
+       $(".sortButton").hide();
+       $("#mediaName").hide();
+       $("#trackTime").hide();
+       $(".player").hide();
        $(".mainButton").css({"opacity": "100"});
-       $(".mainButton").fadeIn(800);
+       $(".mainButton").show();
 }
 
 function sortByAlpha(contentToSort)
 {
-       console.log("MediaPlayer in sortByAlpha");
-
-       if (currentPlayerType === "AUDIO")
-               emptyTimeouts();
-
-       //If contentToSort is undefined it's because the request came from the sortBy buttons
-       if (contentToSort === undefined)
-               contentToSort = audioContent;
-
-       contentToSort.sort(function (a,b) {
-               var first = a.title.toLowerCase();
-               var second = b.title.toLowerCase();
-
-               if (first < second)
-                       return -1;
-               if (first > second)
-                       return 1;
-
-               return 0;
-       });
-
-       fillMediaList(contentToSort);
+       currentPlayer.sortByAlpha();
 }
 
 function sortByArtist(contentToSort)
 {
-       console.log("MediaPlayer in sortByArtist");
-
-       if (currentPlayerType === "AUDIO")
-               emptyTimeouts();
-
-       if (contentToSort === undefined)
-               contentToSort = audioContent;
-
-       contentToSort.sort(function (a,b) {
-               var first = a.artists[0].toLowerCase();
-               var second = b.artists[0].toLowerCase();
-
-               if (first < second)
-                       return -1;
-               if (first > second)
-                       return 1;
-
-               return 0;
-       });
-
-       fillMediaList(contentToSort);
+       currentPlayer.sortByArtist();
 }
 
 function sortByAlbum(contentToSort)
 {
-       if (currentPlayerType === "AUDIO")
-               emptyTimeouts();
-
-       console.log("MediaPlayer in sortByAlbum");
-       if (contentToSort === undefined)
-               contentToSort = audioContent;
-
-       contentToSort.sort(function (a,b) {
-               var first = a.album.toLowerCase();
-               var second = b.album.toLowerCase();
-
-               if (first < second)
-                       return -1;
-               if (first > second)
-                       return 1;
-
-               return 0;
-       });
-
-       fillMediaList(contentToSort);
+       currentPlayer.sortByAlbum();
 }
 
 /**************************************** NAVIGATION FUNCTIONS *******************************************/
@@ -547,163 +401,43 @@ function sortByAlbum(contentToSort)
 // This function is called once a file being loaded is ready to play
 function playLoadedMedia()
 {
-       console.log("MediaPlayer in playLoadedMedia");
-       currentFileLoaded = true;
-
-       if (loadAndPlay)
-       {
-               currentPlayerControls.play();
+       audioPlayer.playLoadedMedia();
+}
 
-               $("#playButton").toggleClass('playing', true);
-               loadAndPlay = false;
-       }
+function videoLoaded()
+{
+    videoPlayer.videoLoaded();
 }
 
 function playButtonClick()
 {
        console.log("MediaPlayer in playButtonClick");
-       if (currentPlayerType !== "AUDIO" || currentFileLoaded)
-       {
-               if (currentPlayerControls.paused)
-               {
-                       $("#playButton").toggleClass('playing', true);
-                       currentPlayerControls.play();
-               }
-               else
-               {
-                       $("#playButton").toggleClass('playing', false);
-                       currentPlayerControls.pause();
-               }
-       }
+       if (!currentPlayer.playing())
+               currentPlayer.play();
        else
-               console.log(audioContent[audioIndex].artists[0] + " : " + audioContent[audioIndex].title + " can't play yet, it hasn't loaded");
+               currentPlayer.pause();
 }
 
 function pauseButtonClick()
 {
        console.log("MediaPlayer in pauseButtonClick");
-       if (!currentPlayerControls.paused)
+       if (currentPlayer.playing())
        {
-               currentPlayerControls.pause();
-               $("#playButton").toggleClass('playing', false);
+               currentPlayer.pause();
        }
 }
 
 function backButtonClick()
 {
        console.log("MediaPlayer in backButtonClick");
-       switch (currentPlayerType)
-       {
-       case "AUDIO":
-               if (audioContent)
-               {
-                       if (audioIndex > 0 )
-                               audioIndex--;
-                       else
-                               audioIndex = audioContent.length - 1;
-
-                       loadAndPlay = true;
-                       audioPlayer.pause();
-
-                       $("#playButton").toggleClass('playing', false);
-
-                       $("#audioSrc").attr("src", audioContent[audioIndex].contentURI);
-                       updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
-                       audioPlayer.load();
-               }
-               break;
-
-       case "VIDEO":
-               if (videoContent)
-               {
-                       if (videoIndex > 0 )
-                               videoIndex--;
-                       else
-                               videoIndex = videoContent.length - 1;
-
-                       videoPlayer.pause();
-                       $("#playButton").toggleClass('playing', false);
-                       $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
-                       videoPlayer.load();
-               }
-               break;
-
-       case "IMAGE":
-               if (imageContent)
-               {
-                       if (imageIndex > 0 )
-                               imageIndex--;
-                       else
-                               imageIndex = imageContent.length - 1;
-
-                       $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
-                       $("#imagePlayer").css("background-size", "contain");
-               }
-               break;
-
-       default:
-               console.log("Content failure");
-       break;
-       }
+       currentPlayer.previous();
 }
 
 
 function nextButtonClick()
 {
        console.log("MediaPlayer in nextButtonClick");
-       switch (currentPlayerType)
-       {
-       case "AUDIO":
-               if (audioContent)
-               {
-                       if (audioContent.length > (audioIndex + 1))
-                               audioIndex++;
-                       else
-                               audioIndex = 0;
-
-                       loadAndPlay = true;
-                       audioPlayer.pause();
-
-                       $("#playButton").toggleClass('playing', false);
-
-                       $("#audioSrc").attr("src", audioContent[audioIndex].contentURI);
-                       updateMediaName(audioContent[audioIndex].artists[0], audioContent[audioIndex].title, audioContent[audioIndex].coverArt);
-                       audioPlayer.load();
-               }
-               break;
-
-       case "VIDEO":
-               if (videoContent)
-               {
-                       if (videoContent.length > (videoIndex + 1))
-                               videoIndex++;
-                       else
-                               videoIndex = 0;
-
-                       videoPlayer.pause();
-                       $("#playButton").toggleClass('playing', false);
-                       $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
-                       videoPlayer.load();
-               }
-               break;
-
-       case "IMAGE":
-               if (imageContent)
-               {
-                       if (imageContent.length > (imageIndex + 1))
-                               imageIndex++;
-                       else
-                               imageIndex = 0;
-
-                       $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
-                       $("#imagePlayer").css("background-size", "contain");
-               }
-               break;
-
-       default:
-               console.log("Content failure");
-       break;
-       }
+       currentPlayer.next();
 }
 
 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
@@ -712,7 +446,7 @@ function resizeMainMenu()
 {
        console.log("MediaPlayer in resizeMainMenu");
 
-       currentMediaList.fadeOut(0);
+       currentMediaList.hide();
        screenWidth = window.innerWidth;
        screenHeight = window.innerHeight;
        screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
@@ -737,8 +471,6 @@ function resizePlayerPage()
 {
        console.log("MediaPlayer in resizePlayerPage");
 
-       audioPlayer = document.getElementById("audioPlayer");
-       videoPlayer = document.getElementById("videoPlayer");
        screenWidth = window.innerWidth;
        screenHeight = window.innerHeight;
 
@@ -751,10 +483,10 @@ function resizePlayerPage()
        $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
        $("#playButton").css({"width": buttonWidth * 1.15 + "px", "height": buttonWidth * 1.15 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
 
-       mediaNameCanvas.width = (screenWidth);
-       mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
-       mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
-       mediaNameCanvas.style.left = "0px";
+       trackTimeCanvas.width = mediaNameCanvas.width = (screenWidth);
+       trackTimeCanvas.height = mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
+       trackTimeCanvas.style.top = mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
+       trackTimeCanvas.style.left = mediaNameCanvas.style.left = "0px";
 
        var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
        var sortButtonWidth = buttonWidth * 2.5;
@@ -805,6 +537,18 @@ function toggleNightMode(nightModeValue)
 function init()
 {
        console.log("MediaPlayer in init");
+
+       musicIcon.src = "images/musicIcon.png";
+       vidIcon.src = "images/videoIcon.png";
+       imgIcon.src = "images/imageIcon.png";
+       mediaNameCanvas = document.getElementById("mediaName");
+       mediaNameCTX = mediaNameCanvas.getContext("2d");
+       trackTimeCanvas = document.getElementById("trackTime");
+       trackTimeCTX = trackTimeCanvas.getContext("2d");
+       playBarHeight = mediaNameCanvas.height;
+       boxWidth = playBarHeight * 0.75;
+       textStartX = boxWidth + 50;
+
        var vehicle = tizen.vehicle;
 
 
@@ -840,49 +584,59 @@ function init()
                vehicle.subscribe("DrivingMode",function(value) {
                        console.log("MediaPlayer: DrivingMode changed to " + value.drivingMode);
 
-                       if (value.drivingMode > 0 && currentPlayerType === "VIDEO" && !currentPlayerControls.paused)
+                       if (value.drivingMode > 0 && currentPlayer.type === "video" && currentPlayer.playing())
                        {
                                console.log("MediaPlayer: pausing video due to vehicle motion");
-                               currentPlayerControls.pause();
+                               currentPlayer.pause();
                                waitingToResumeVideo = true;
                        }
-                       else if (value.drivingMode === 0 && currentPlayerType === "VIDEO" && waitingToResumeVideo)
+                       else if (value.drivingMode === 0 && currentPlayer.type === "video" && waitingToResumeVideo)
                        {
                                console.log("MediaPlayer: vehicle has stopped, resuming video");
-                               currentPlayerControls.play();
+                               currentPlayer.play();
                                waitingToResumeVideo = false;
                        }
                });
        }
 
-       musicIcon.src = "images/musicIcon.png";
-       vidIcon.src = "images/videoIcon.png";
-       imgIcon.src = "images/imageIcon.png";
-       imageControls = new ImageControls();
+       //Setup voice control
+       if (tizen.speech)
+               setupSpeech();
+       else {
+               console.log("MediaPlayer: Speech Recognition not running, voice control will be unavailable");
+                speechObj = {
+                    vocalizeString: function(item) { console.log(item); }
+                };
+        }
 
-       mediaNameCanvas = document.getElementById("mediaName");
-       mediaNameCTX = mediaNameCanvas.getContext("2d");
+       audioPlayer = new MediaPlayer("audio");
+       videoPlayer = new MediaPlayer("video");
+       imagePlayer = new MediaPlayer("image");
+       currentPlayer = audioPlayer;
 
        //Resize all items and search for local media
        resizeAll();
 
+       if (localStorage.prevMenu && localStorage.prevMenu !== "MAIN")
+               changeMenu(localStorage.prevMenu)
+       else
+               showMainMenu();
+
+       getMedia(onAudioContentLoaded, "AUDIO");
+       getMedia(onVideoContentLoaded, "VIDEO");
+       getMedia(onImageContentLoaded, "IMAGE");
+
        //Check if DLNA plugin is installed.  If so, scan for media.
        if (tizen.mediaserver)
        {
-               tizen.mediaserver.scanNetwork(foundMediaServer);
+               //Currently no success signal, so continue trying until a server is found.  Once that
+               //happens, clear the stopServerSearch interval
+
+               stopServerSearch = setInterval(function(){console.log("MediaPlayer searching for remote media..."); tizen.mediaserver.scanNetwork(foundMediaServer);}, 5000);
        }
        else
                console.log("MediaPlayer: No DLNA server running, using local media only...");
 
-       //Setup voice control
-       if (tizen.speech)
-               setupSpeech();
-       else
-               console.log("MediaPlayer: Speech Recognition not running, voice control will be unavailable");
-
-       //Get local media
-       setTimeout(function(){getMedia(contentType);}, 500);
-
        //Prevent highlighting
        window.ondragstart = function() { return false; }
 
@@ -904,11 +658,39 @@ function init()
        });
 
     document.getElementById('videoPlayer').addEventListener("playing", function() {
+        $("#playButton").toggleClass('playing', true);
         $("#navigationButtons").hide();
     }, false);
     document.getElementById('videoPlayer').addEventListener("pause", function() {
+        $("#playButton").toggleClass('playing', false);
         $("#navigationButtons").show();
     }, false);
+    document.getElementById('videoPlayer').addEventListener("ended", function() {
+        $("#playButton").toggleClass('playing', false);
+        $("#navigationButtons").show();
+    }, false);
+    document.getElementById('audioPlayer').addEventListener("playing", function() {
+        $("#playButton").toggleClass('playing', true);
+    }, false);
+    document.getElementById('audioPlayer').addEventListener("pause", function() {
+        $("#playButton").toggleClass('playing', false);
+    }, false);
+    document.getElementById('audioPlayer').addEventListener("ended", function() {
+        $("#playButton").toggleClass('playing', false);
+    }, false);
+    document.getElementById('imagePlayer').addEventListener("click", function() {
+       if (!imagePlayer.playing)
+        {
+            // next picture
+            nextButtonClick();
+        }
+        else
+        {
+            // pause the slideshow and fade in the controls
+            imagePlayer.pause();
+            $("#navigationButtons").show();
+        }
+    }, false);
 }
 
 $(document).ready(function () {