2 * Copyright (c) 2013, Intel Corporation.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 var currentMenu = "main";
12 var resizeCB = resizeMainMenu;
15 var screenOrientation;
18 var contentType = "AUDIO";
24 var currentPlayerType = "AUDIO";
25 var currentPlayerControls;
31 var vidIcon = new Image();
32 var imgIcon = new Image();
33 var imagesLoaded = false;
41 var mainMenuTitleTemplateLandscape = {"font" : "oblique bolder 30pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
42 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
44 var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
45 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
47 var mainTrackTemplateLandscape = {"font" : "bold 20pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
48 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
50 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
51 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
53 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
54 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
56 var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
58 var trackTextTemplate = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
60 var mediaTextTemplate2Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
61 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
63 var mediaTextTemplate3Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
65 var trackTextTemplateLandscape = {"font" : "bold 11pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
68 var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
69 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
73 console.log("Content discovery failed");
76 function loadImages(callback)
81 for (var src in audioContent)
85 for (var src in audioContent)
87 audioContent[src].coverArt = new Image();
88 audioContent[src].coverArt.onload = function(){
90 if (++loadedImages >= numImages) {
92 callback(audioContent);
96 audioContent[src].coverArt.onerror = function(e){
97 audioContent[src].coverArt.src = "images/musicButton.png";
100 audioContent[src].coverArt.src = audioContent[src].coverArtURI;
104 function updateMediaName(newArtist, newTitle, newCover)
106 var playBarHeight = mediaNameCanvas.height;
107 var boxWidth = playBarHeight * 0.75;
108 mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
110 if (currentPlayerType === "AUDIO")
113 var alphaJump = 0.01;
117 mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
118 mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
119 mediaNameCTX.lineWidth = 5;
120 mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
121 mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
122 mediaNameCTX.drawImage(newCover, 20, (playBarHeight - boxWidth) / 2, boxWidth, boxWidth);
124 if (screenOrientation === "portrait")
126 var textStartX = boxWidth + 50;
127 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
128 trackText.applyTemplate(mainMenuTitleTemplate);
129 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});
130 artistText.applyTemplate(mainTrackTemplate);
133 trackText.drawLargeShadow();
135 artistText.yLoc = 70 + trackText.height;
136 artistText.drawObj();
140 var textStartX = boxWidth + 50;
141 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 50 , "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
142 trackText.applyTemplate(mainMenuTitleTemplateLandscape);
143 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
144 artistText.applyTemplate(mainTrackTemplateLandscape);
147 trackText.drawLargeShadow();
149 artistText.yLoc = 50 + trackText.height;
150 artistText.drawObj();
155 function fillMediaList(contentList)
162 var iconImg = new Image();
163 var canvasW = mediaListItemW;
164 var canvasH = mediaListItemH * 0.95 ;
166 $("#mediaListItems").empty();
167 var lightColor = false;
168 for (var i=0; i < contentList.length; i++)
172 $("#mediaListItems").append("<li><a href='#'>" +
173 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
179 $("#mediaListItems").append("<li><a href='#' class='lightColor'>" +
180 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
185 lightColor = !lightColor;
187 currentCanvas = document.getElementById("canvasNum"+ i);
188 currentCTX = currentCanvas.getContext("2d");
190 // Set callback function for the new list item
191 $("#canvasNum"+i).click(function () {
192 listIndex = $(this).parent().parent().index();
194 switch (currentPlayerType)
197 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
198 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
202 updateMediaName(videoContent[listIndex].artists[0], audioContent[listIndex].title, vidIcon);
203 $("#videoSrc").attr("src", videoContent[listIndex].contentURI);
205 $("#mediaList").fadeOut(300);
208 $("#imagePlayer").css("background", "url(" + imageContent[listIndex].contentURI + ") no-repeat center");
209 $("#imagePlayer").css("background-size", "contain");
210 $("#mediaList").fadeOut(300);
217 switch (currentPlayerType)
220 currentCTX.drawImage(audioContent[i].coverArt, 0, 0, canvasH, canvasH );
221 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
222 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
226 currentCTX.drawImage(vidIcon, 0, 0, canvasH, canvasH );
227 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
228 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
232 currentCTX.drawImage(imgIcon, 0, 0, canvasH, canvasH );
233 var artistText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
234 var trackText = new TextObject(currentCTX,{"text" : " ", "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
240 var mediaTextTemp1 = screenOrientation === "portrait" ? mediaTextTemplate2 : mediaTextTemplate2Landscape;
241 var mediaTextTemp2 = screenOrientation === "portrait" ? mediaTextTemplate3 : mediaTextTemplate3Landscape;
242 var trackTextTemp = screenOrientation === "portrait" ? trackTextTemplate : trackTextTemplateLandscape;
244 trackText.applyTemplate(mediaTextTemp1);
246 trackText.applyTemplate(mediaTextTemp2);
249 artistText.applyTemplate(trackTextTemp);
250 artistText.drawObj();
253 $("#mediaListItems li").css({"width" : mediaListItemW + "px", "height" : mediaListItemH + "px", "margin-bottom" : "10px"});
256 function onContentItemArraySuccess(content)
258 var emptyContent = true;
260 if (!content || content === undefined || content.length <= 0)
261 console.log("Invalid content");
264 emptyContent = false;
272 audioContent = content;
273 sortByAlpha(audioContent);
275 $("#audioSrc").attr("src", audioContent[0].contentURI);
278 for (var i=0; i < audioContent.length; i++)
281 audioContent[i].coverArtURI = "images/musicButton.png";
284 var iconURI = audioContent[i].thumbnailURIs[0].length > 1 ? audioContent[i].thumbnailURIs[0] : "images/musicButton.png";
285 audioContent[i].coverArtURI = iconURI;
289 loadImages(fillMediaList);
291 contentType = "VIDEO";
296 videoContent = content;
297 $("#videoSrc").attr("src", videoContent[0].contentURI);
299 contentType = "IMAGE";
304 imageContent = content;
305 $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
306 $("#imagePlayer").css("background-size", "contain");
308 contentType = undefined;
311 console.log("Undefined content search type");
312 nextContentType = undefined;
316 if (contentType !== undefined)
317 getMedia(contentType);
320 function getMedia(mediaType)
322 var manager = tizen.content;
324 var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
325 manager.find(onContentItemArraySuccess, onError, null, filter);
328 function showMediaMenu()
330 $(".navButton").fadeIn(800);
332 switch(currentPlayerType)
336 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
337 $("#mediaName").fadeIn(800);
338 $(".sortButton").fadeIn(800);
339 currentPlayer.fadeIn(800);
340 $("#mediaList").addClass("mediaListAudioList");
342 if (screenOrientation === "landscape" )
343 $("#mediaList").addClass("landscape");
345 $("#mediaList").removeClass("landscape");
347 $("#mediaList").fadeIn(800);
351 setTimeout(function(){currentPlayer.show()}, 800); //The video element can't be faded, so wait a moment before showing
355 currentPlayer.fadeIn(800);
358 console.log("Invalid player type");
363 function showMediaList()
365 if ($("#mediaList").is(":visible"))
366 $("#mediaList").fadeOut(300);
369 fillMediaList(currentContent);
370 $("#mediaList").fadeIn(300);
374 function changeMenu(menuButtonId)
376 var clickedButton = $("#" + menuButtonId);
377 var buttonWidth = clickedButton.width();
378 var buttonHeight = clickedButton.height();
379 var buttonBottom = clickedButton.css("bottom");
380 var buttonRight = clickedButton.css("right");
382 //Animate the clicked button slightly
383 clickedButton.animate({
384 bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
385 right: screenOrientation === "portrait" ? "+=50" : "+=0",
389 //Reset the size once done
391 clickedButton.width(buttonWidth);
392 clickedButton.height(buttonHeight);
394 if (screenOrientation === "portrait")
395 clickedButton.css({"right": buttonRight});
397 clickedButton.css({"bottom": buttonBottom});
401 $(".mainButton").fadeOut(300);
405 case ("mainMusicButton"):
406 currentPlayer = $("#audioPlayer");
407 currentPlayerControls = document.getElementById("audioPlayer");
408 currentPlayerType = "AUDIO";
409 currentContent = audioContent;
412 case ("mainVideoButton"):
413 currentPlayer = $("#videoPlayer");
414 currentPlayerControls = document.getElementById("videoPlayer");
415 currentPlayerType = "VIDEO";
416 currentContent = videoContent;
419 case ("mainImageButton"):
420 currentPlayer = $("#imagePlayer");
421 currentPlayerControls = imageControls;
422 currentPlayerType = "IMAGE";
423 currentContent = imageContent;
427 console.log("Error: No menu by that name");
432 function showMainMenu()
434 currentPlayerControls.pause();
436 $("#playButton").attr("src","images/playButton.png");
438 //If the media list is showing, hide it. Remove the mediaListAudioList class if it exists so that it will resize properly
439 if ($("#mediaList").is(":visible"))
440 $("#mediaList").fadeOut(300, function(){$("#mediaList").removeClass("mediaListAudioList");});
442 $(".navButton").fadeOut(300);
443 $(".sortButton").fadeOut(300);
444 $("#mediaName").fadeOut(300);
446 if (currentPlayerType !== "VIDEO")
447 currentPlayer.fadeOut(300);
449 currentPlayer.hide();
452 $(".mainButton").css({"opacity": "100"});
453 $(".mainButton").fadeIn(800);
456 function sortByAlpha(contentToSort)
458 //If contentToSort is undefined it's because the request came from the sortBy buttons
459 if (contentToSort === undefined)
460 contentToSort = audioContent;
462 contentToSort.sort(function (a,b) {
463 var first = a.title.toLowerCase();
464 var second = b.title.toLowerCase();
474 fillMediaList(contentToSort);
477 function sortByArtist(contentToSort)
479 if (contentToSort === undefined)
480 contentToSort = audioContent;
482 contentToSort.sort(function (a,b) {
483 var first = a.artists[0].toLowerCase();
484 var second = b.artists[0].toLowerCase();
494 fillMediaList(contentToSort);
497 function sortByAlbum(contentToSort)
499 if (contentToSort === undefined)
500 contentToSort = audioContent;
502 contentToSort.sort(function (a,b) {
503 var first = a.album.toLowerCase();
504 var second = b.album.toLowerCase();
514 fillMediaList(contentToSort);
516 /**************************************** NAVIGATION FUNCTIONS *******************************************/
518 function playButtonClick()
520 if (currentPlayerControls.paused)
522 currentPlayerControls.play();
523 $("#playButton").attr("src","images/pauseButton.png");
527 currentPlayerControls.pause();
528 $("#playButton").attr("src","images/playButton.png");
532 function backButtonClick()
534 switch (currentPlayerType)
542 listIndex = imageContent.length - 1;
545 $("#playButton").attr("src","images/playButton.png");
547 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
548 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
559 videoIndex = imageContent.length - 1;
561 if ($("#mediaList").is(":visible"))
564 $("#playButton").attr("src","images/playButton.png");
565 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
576 imageIndex = imageContent.length - 1;
578 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
579 $("#imagePlayer").css("background-size", "contain");
584 console.log("Content failure");
590 function nextButtonClick()
592 switch (currentPlayerType)
597 if (audioContent.length > (listIndex + 1))
603 $("#playButton").attr("src","images/playButton.png");
605 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
606 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
614 if (videoContent.length > (videoIndex + 1))
620 $("#playButton").attr("src","images/playButton.png");
622 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
630 if (imageContent.length > (imageIndex + 1))
635 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
636 $("#imagePlayer").css("background-size", "contain");
641 console.log("Content failure");
646 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
648 function resizeMainMenu()
650 $("#mediaList").fadeOut(0);
651 screenWidth = window.innerWidth;
652 screenHeight = window.innerHeight;
653 screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
654 iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
657 $(".mainButton").width(iconWidth + "px");
658 $(".mainButton").height(iconWidth + "px");
660 var iconsTop = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
662 if (screenOrientation === "portrait")
663 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
666 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - (padding * 3)) + "px", "width" : "100%"});
667 $("#sortButtons").addClass("landscape");
671 function resizePlayerPage()
673 audioPlayer = document.getElementById("audioPlayer");
674 videoPlayer = document.getElementById("videoPlayer");
675 screenWidth = window.innerWidth;
676 screenHeight = window.innerHeight;
679 var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
681 $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
682 $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
683 $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
684 $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
685 $("#playButton").css({"width": buttonWidth * 1.3 + "px", "height": buttonWidth * 1.3 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
687 mediaNameCanvas.width = (screenWidth);
688 mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
689 mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
690 mediaNameCanvas.style.left = "0px";
692 var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
693 var sortButtonWidth = buttonWidth * 2.5;
694 var buttonSpacing = screenWidth / 5;
695 $(".player").css({"height": (screenHeight - (buttonWidth * 2) - (padding * 2)) + "px", "top": buttonWidth + padding + "px"});
697 mediaListItemW = $("#mediaList").width() * 0.92;
698 mediaListItemH = $("#mediaList").height() / 10;
708 * swipe - Handles swipe events. Currently it just acts as another way to hit the next / back buttons, but
709 * it could be expanded to other things in the future.
712 function swipe(direction, object)
718 if (direction === "right")
720 else if (direction === "left")
731 vidIcon.src = "images/videoButton.png";
732 imgIcon.src = "images/imageButton.png";
733 imageControls = new ImageControls();
735 mediaNameCanvas = document.getElementById("mediaName");
736 mediaNameCTX = mediaNameCanvas.getContext("2d");
738 //Resize all items and search for local media
740 getMedia(contentType);
742 //Prevent highlighting
743 window.ondragstart = function() { return false; }
745 $(window).bind('resize', resizeAll);
747 //Simple swipe detection
748 $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
749 $("#mediaName").mouseup(function(e){
750 if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
752 if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
754 if (mouseDownEvent.clientX > e.clientX)
755 swipe("left", "mediaName");
757 swipe("right", "mediaName");
763 $(document).ready(function () {