1 var currentMenu = "main";
3 var resizeCB = resizeMainMenu;
9 var contentType = "AUDIO";
15 var currentPlayerType = "AUDIO";
16 var currentPlayerControls;
22 var vidIcon = new Image();
23 var imgIcon = new Image();
24 var metalBar = new Image();
25 var imagesLoaded = false;
30 var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
31 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"}; //150
33 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
34 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
36 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
37 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
39 var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
41 var trackTextTemplate = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
43 var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
44 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
48 alert("Content discovery failed");
51 function loadImages(callback)
56 for (var src in audioContent)
60 for (var src in audioContent)
62 audioContent[src].coverArt = new Image();
63 audioContent[src].coverArt.onload = function(){
64 if (++loadedImages >= numImages) {
66 callback(audioContent);
69 audioContent[src].coverArt.src = audioContent[src].coverArtURI;
73 function updateMediaName(newArtist, newTitle, newCover)
75 var playBarHeight = mediaNameCanvas.height;
76 var boxWidth = playBarHeight * 0.75;
77 mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
79 if (currentPlayerType === "AUDIO")
81 if (screenOrientation === "portrait")
88 mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
89 mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
90 mediaNameCTX.lineWidth = 5;
91 mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
92 mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
93 mediaNameCTX.drawImage(newCover, 20, 20, boxWidth, boxWidth);
94 var textStartX = boxWidth + 50;
95 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
96 trackText.applyTemplate(mainMenuTitleTemplate);
97 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 70 + trackText.height, "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
101 mediaNameCTX.drawImage(newCover, 0, 0, mediaNameCanvas.height, mediaNameCanvas.height);
105 trackText.drawLargeShadow();
107 artistText.yLoc = 70 + trackText.height;
108 artistText.applyTemplate(mainTrackTemplate);
109 artistText.drawObj();
112 function fillMediaList(contentList)
119 var iconImg = new Image();
120 var mediaListItemW = $("#mediaList").width() * 0.92;
121 var mediaListItemH = $("#mediaList").height() / 10;
122 var canvasW = mediaListItemW;// * 0.9;
123 var canvasH = mediaListItemH * 0.95 ;
125 $("#mediaListItems").empty();
126 var lightColor = false;
127 for (var i=0; i < contentList.length; i++)
131 $("#mediaListItems").append("<li><a href='#'>" +
132 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
138 $("#mediaListItems").append("<li><a href='#' class='lightColor'>" +
139 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
144 lightColor = !lightColor;
146 currentCanvas = document.getElementById("canvasNum"+ i);
147 currentCTX = currentCanvas.getContext("2d");
149 // Set callback function for the new list item
150 $("#canvasNum"+i).click(function () {
151 listIndex = $(this).parent().parent().index();
153 switch (currentPlayerType)
156 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
157 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
161 updateMediaName(videoContent[listIndex].artists[0], audioContent[listIndex].title, vidIcon);
162 $("#videoSrc").attr("src", videoContent[listIndex].contentURI);
164 $("#mediaList").fadeOut(300);
167 $("#imagePlayer").css("background", "url(" + imageContent[listIndex].contentURI + ") no-repeat center");
168 $("#imagePlayer").css("background-size", "contain");
169 $("#mediaList").fadeOut(300);
176 switch (currentPlayerType)
179 currentCTX.drawImage(audioContent[i].coverArt, 0, 0, canvasH, canvasH );
180 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
181 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
185 currentCTX.drawImage(vidIcon, 0, 0, canvasH, canvasH );
186 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
187 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
191 currentCTX.drawImage(imgIcon, 0, 0, canvasH, canvasH );
192 var artistText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
193 var trackText = new TextObject(currentCTX,{"text" : " ", "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
199 trackText.applyTemplate(mediaTextTemplate2);
201 trackText.applyTemplate(mediaTextTemplate3);
204 artistText.applyTemplate(trackTextTemplate);
205 artistText.drawObj();
208 $("#mediaListItems li").css({"width" : mediaListItemW + "px", "height" : mediaListItemH + "px", "margin-bottom" : "10px"});
211 function onContentItemArraySuccess(content)
213 var emptyContent = true;
215 if (!content || content === undefined || content.length <= 0)
216 alert("Invalid content");
219 emptyContent = false;
227 audioContent = content;
228 sortByAlpha(audioContent);
230 $("#audioSrc").attr("src", audioContent[0].contentURI);
233 for (var i=0; i < audioContent.length; i++)
235 var iconURI = audioContent[i].thumbnailURIs[0].length > 1 ? audioContent[i].thumbnailURIs[0] : "images/musicButton.png";
236 audioContent[i].coverArtURI = iconURI;
239 loadImages(fillMediaList);
241 contentType = "VIDEO";
246 videoContent = content;
247 $("#videoSrc").attr("src", videoContent[0].contentURI);
249 contentType = "IMAGE";
254 imageContent = content;
255 $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
256 $("#imagePlayer").css("background-size", "contain");
258 contentType = undefined;
261 console.log("Undefined content search type");
262 nextContentType = undefined;
266 if (contentType !== undefined)
267 getMedia(contentType);
270 function getMedia(mediaType)
272 var manager = tizen.content;
274 var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
275 manager.find(onContentItemArraySuccess, onError, null, filter);
278 function showMediaMenu()
280 $(".navButton").fadeIn(800);
282 switch(currentPlayerType)
286 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
287 $("#mediaName").fadeIn(800);
288 $(".sortButton").fadeIn(800);
289 currentPlayer.fadeIn(800);
290 $("#mediaList").addClass("mediaListAudioList");
291 $("#mediaList").fadeIn(800);
295 setTimeout(function(){currentPlayer.show()}, 800); //The video element can't be faded, so wait a moment before showing
299 currentPlayer.fadeIn(800);
302 console.log("Invalid player type");
307 function showMediaList()
309 if ($("#mediaList").is(":visible"))
310 $("#mediaList").fadeOut(300);
313 fillMediaList(currentContent);
314 $("#mediaList").fadeIn(300);
318 function changeMenu(menuButtonId)
320 var clickedButton = $("#" + menuButtonId);
321 var buttonWidth = clickedButton.width();
322 var buttonHeight = clickedButton.height();
323 var buttonBottom = clickedButton.css("bottom");
324 var buttonRight = clickedButton.css("right");
326 //Animate the clicked button slightly
327 clickedButton.animate({
328 bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
329 right: screenOrientation === "portrait" ? "+=50" : "+=0",
333 //Reset the size once done
335 clickedButton.width(buttonWidth);
336 clickedButton.height(buttonHeight);
338 if (screenOrientation === "portrait")
339 clickedButton.css({"right": buttonRight});
341 clickedButton.css({"bottom": buttonBottom});
345 $(".mainButton").fadeOut(300);
349 case ("mainMusicButton"):
350 currentPlayer = $("#audioPlayer");
351 currentPlayerControls = document.getElementById("audioPlayer");
352 currentPlayerType = "AUDIO";
353 currentContent = audioContent;
356 case ("mainVideoButton"):
357 currentPlayer = $("#videoPlayer");
358 currentPlayerControls = document.getElementById("videoPlayer");
359 currentPlayerType = "VIDEO";
360 currentContent = videoContent;
363 case ("mainImageButton"):
364 currentPlayer = $("#imagePlayer");
365 currentPlayerType = "IMAGE";
366 currentContent = imageContent;
370 console.log("Error: No menu by that name");
375 function showMainMenu()
379 $("#playButton").attr("src","images/playButton.png");
381 //If the media list is showing, hide it. Remove the mediaListAudioList class if it exists so that it will resize properly
382 if ($("#mediaList").is(":visible"))
383 $("#mediaList").fadeOut(300, function(){$("#mediaList").removeClass("mediaListAudioList");});
385 $(".navButton").fadeOut(300);
386 $(".sortButton").fadeOut(300);
387 $("#mediaName").fadeOut(300);
389 if (currentPlayerType !== "VIDEO")
390 currentPlayer.fadeOut(300);
392 currentPlayer.hide();
395 $(".mainButton").css({"opacity": "100"});
396 $(".mainButton").fadeIn(800);
399 function sortByAlpha(contentToSort)
401 //If contentToSort is undefined it's because the request came from the sortBy buttons
402 if (contentToSort === undefined)
403 contentToSort = audioContent;
405 contentToSort.sort(function (a,b) {
406 var first = a.title.toLowerCase();
407 var second = b.title.toLowerCase();
417 fillMediaList(contentToSort);
420 function sortByArtist(contentToSort)
422 if (contentToSort === undefined)
423 contentToSort = audioContent;
425 contentToSort.sort(function (a,b) {
426 var first = a.artists[0].toLowerCase();
427 var second = b.artists[0].toLowerCase();
437 fillMediaList(contentToSort);
440 function sortByAlbum(contentToSort)
442 if (contentToSort === undefined)
443 contentToSort = audioContent;
445 contentToSort.sort(function (a,b) {
446 var first = a.album.toLowerCase();
447 var second = b.album.toLowerCase();
457 fillMediaList(contentToSort);
459 /**************************************** NAVIGATION FUNCTIONS *******************************************/
461 function playButtonClick()
463 if (currentPlayerControls.paused)
465 currentPlayerControls.play();
466 $("#playButton").attr("src","images/pauseButton.png");
470 currentPlayerControls.pause();
471 $("#playButton").attr("src","images/playButton.png");
475 function backButtonClick()
477 switch (currentPlayerType)
485 listIndex = imageContent.length - 1;
488 $("#playButton").attr("src","images/playButton.png");
490 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
491 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
501 videoIndex = imageContent.length - 1;
503 if ($("#mediaList").is(":visible"))
505 $("#playButton").attr("src","images/playButton.png");
506 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
516 imageIndex = imageContent.length - 1;
518 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
519 $("#imagePlayer").css("background-size", "contain");
523 console.log("Content failure");
529 function nextButtonClick()
531 switch (currentPlayerType)
536 if (audioContent.length > (listIndex + 1))
542 $("#playButton").attr("src","images/playButton.png");
544 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
545 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
552 if (videoContent.length > (videoIndex + 1))
558 $("#playButton").attr("src","images/playButton.png");
560 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
567 if (imageContent.length > (imageIndex + 1))
572 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
573 $("#imagePlayer").css("background-size", "contain");
577 console.log("Content failure");
582 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
584 function resizeMainMenu()
586 $("#mediaList").fadeOut(0);
587 screenWidth = window.innerWidth;
588 screenHeight = window.innerHeight;
589 screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
590 iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
593 $(".mainButton").width(iconWidth + "px");
594 $(".mainButton").height(iconWidth + "px");
596 var iconsTop = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
598 if (screenOrientation === "portrait")
599 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
601 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - S(padding * 3)) + "px", "width" : "100%"});
604 function resizePlayerPage()
606 audioPlayer = document.getElementById("audioPlayer");
607 videoPlayer = document.getElementById("videoPlayer");
608 screenWidth = window.innerWidth;
609 screenHeight = window.innerHeight;
612 var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
614 $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
615 $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
616 $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
617 $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
618 $("#playButton").css({"width": buttonWidth * 1.3 + "px", "height": buttonWidth * 1.3 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
620 mediaNameCanvas.width = (screenWidth);
621 mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
622 mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
623 mediaNameCanvas.style.left = "0px";
625 var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
626 var sortButtonWidth = buttonWidth * 2.5;
627 var buttonSpacing = screenWidth / 5;
628 $(".player").css({"height": (screenHeight - (buttonWidth * 2) - (padding * 2)) + "px", "top": buttonWidth + padding + "px"});
638 * swipe - Handles swipe events. Currently it just acts as another way to hit the next / back buttons, but
639 * it could be expanded to other things in the future.
642 function swipe(direction, object)
648 if (direction === "right")
650 else if (direction === "left")
661 vidIcon.src = "images/videoButton.png";
662 imgIcon.src = "images/imageButton.png";
663 metalBar.src = "images/metalBarH.png";
665 mediaNameCanvas = document.getElementById("mediaName");
666 mediaNameCTX = mediaNameCanvas.getContext("2d");
668 //Resize all items and search for local media
670 getMedia(contentType);
672 //Prevent highlighting
673 window.ondragstart = function() { return false; }
675 $(window).bind('resize', resizeAll);
677 //Simple swipe detection
678 $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
679 $("#mediaName").mouseup(function(e){
680 if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
682 if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
684 if (mouseDownEvent.clientX > e.clientX)
685 swipe("left", "mediaName");
687 swipe("right", "mediaName");
693 $(document).ready(function () {