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 metalBar = new Image();
34 var imagesLoaded = false;
39 var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
40 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"}; //150
42 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
43 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
45 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
46 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
48 var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
50 var trackTextTemplate = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
52 var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
53 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
57 alert("Content discovery failed");
60 function loadImages(callback)
65 for (var src in audioContent)
69 for (var src in audioContent)
71 audioContent[src].coverArt = new Image();
72 audioContent[src].coverArt.onload = function(){
73 if (++loadedImages >= numImages) {
75 callback(audioContent);
79 audioContent[src].coverArt.onerror = function(e){
80 audioContent[src].coverArt.src = "images/musicButton.png";
83 audioContent[src].coverArt.src = audioContent[src].coverArtURI;
87 function updateMediaName(newArtist, newTitle, newCover)
89 var playBarHeight = mediaNameCanvas.height;
90 var boxWidth = playBarHeight * 0.75;
91 mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
93 if (currentPlayerType === "AUDIO")
100 mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
101 mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
102 mediaNameCTX.lineWidth = 5;
103 mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
104 mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
105 mediaNameCTX.drawImage(newCover, 20, 20, boxWidth, boxWidth);
106 var textStartX = boxWidth + 50;
107 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0, "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
108 trackText.applyTemplate(mainMenuTitleTemplate);
109 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});
111 mediaNameCTX.drawImage(newCover, 0, 0, mediaNameCanvas.height, mediaNameCanvas.height);
115 trackText.drawLargeShadow();
117 artistText.yLoc = 70 + trackText.height;
118 artistText.applyTemplate(mainTrackTemplate);
119 artistText.drawObj();
122 function fillMediaList(contentList)
129 var iconImg = new Image();
130 var mediaListItemW = $("#mediaList").width() * 0.92;
131 var mediaListItemH = $("#mediaList").height() / 10;
132 var canvasW = mediaListItemW;// * 0.9;
133 var canvasH = mediaListItemH * 0.95 ;
135 $("#mediaListItems").empty();
136 var lightColor = false;
137 for (var i=0; i < contentList.length; i++)
141 $("#mediaListItems").append("<li><a href='#'>" +
142 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
148 $("#mediaListItems").append("<li><a href='#' class='lightColor'>" +
149 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
154 lightColor = !lightColor;
156 currentCanvas = document.getElementById("canvasNum"+ i);
157 currentCTX = currentCanvas.getContext("2d");
159 // Set callback function for the new list item
160 $("#canvasNum"+i).click(function () {
161 listIndex = $(this).parent().parent().index();
163 switch (currentPlayerType)
166 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
167 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
171 updateMediaName(videoContent[listIndex].artists[0], audioContent[listIndex].title, vidIcon);
172 $("#videoSrc").attr("src", videoContent[listIndex].contentURI);
174 $("#mediaList").fadeOut(300);
177 $("#imagePlayer").css("background", "url(" + imageContent[listIndex].contentURI + ") no-repeat center");
178 $("#imagePlayer").css("background-size", "contain");
179 $("#mediaList").fadeOut(300);
186 switch (currentPlayerType)
189 currentCTX.drawImage(audioContent[i].coverArt, 0, 0, canvasH, canvasH );
190 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
191 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
195 currentCTX.drawImage(vidIcon, 0, 0, canvasH, canvasH );
196 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
197 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
201 currentCTX.drawImage(imgIcon, 0, 0, canvasH, canvasH );
202 var artistText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
203 var trackText = new TextObject(currentCTX,{"text" : " ", "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
209 trackText.applyTemplate(mediaTextTemplate2);
211 trackText.applyTemplate(mediaTextTemplate3);
214 artistText.applyTemplate(trackTextTemplate);
215 artistText.drawObj();
218 $("#mediaListItems li").css({"width" : mediaListItemW + "px", "height" : mediaListItemH + "px", "margin-bottom" : "10px"});
221 function onContentItemArraySuccess(content)
223 var emptyContent = true;
225 if (!content || content === undefined || content.length <= 0)
226 alert("Invalid content");
229 emptyContent = false;
237 audioContent = content;
238 sortByAlpha(audioContent);
240 $("#audioSrc").attr("src", audioContent[0].contentURI);
243 for (var i=0; i < audioContent.length; i++)
246 audioContent[i].coverArtURI = "images/musicButton.png";
249 var iconURI = audioContent[i].thumbnailURIs[0].length > 1 ? audioContent[i].thumbnailURIs[0] : "images/musicButton.png";
250 audioContent[i].coverArtURI = iconURI;
254 loadImages(fillMediaList);
256 contentType = "VIDEO";
261 videoContent = content;
262 $("#videoSrc").attr("src", videoContent[0].contentURI);
264 contentType = "IMAGE";
269 imageContent = content;
270 $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
271 $("#imagePlayer").css("background-size", "contain");
273 contentType = undefined;
276 console.log("Undefined content search type");
277 nextContentType = undefined;
281 if (contentType !== undefined)
282 getMedia(contentType);
285 function getMedia(mediaType)
287 var manager = tizen.content;
289 var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
290 manager.find(onContentItemArraySuccess, onError, null, filter);
293 function showMediaMenu()
295 $(".navButton").fadeIn(800);
297 switch(currentPlayerType)
301 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
302 $("#mediaName").fadeIn(800);
303 $(".sortButton").fadeIn(800);
304 currentPlayer.fadeIn(800);
305 $("#mediaList").addClass("mediaListAudioList");
306 $("#mediaList").fadeIn(800);
310 setTimeout(function(){currentPlayer.show()}, 800); //The video element can't be faded, so wait a moment before showing
314 currentPlayer.fadeIn(800);
317 console.log("Invalid player type");
322 function showMediaList()
324 if ($("#mediaList").is(":visible"))
325 $("#mediaList").fadeOut(300);
328 fillMediaList(currentContent);
329 $("#mediaList").fadeIn(300);
333 function changeMenu(menuButtonId)
335 var clickedButton = $("#" + menuButtonId);
336 var buttonWidth = clickedButton.width();
337 var buttonHeight = clickedButton.height();
338 var buttonBottom = clickedButton.css("bottom");
339 var buttonRight = clickedButton.css("right");
341 //Animate the clicked button slightly
342 clickedButton.animate({
343 bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
344 right: screenOrientation === "portrait" ? "+=50" : "+=0",
348 //Reset the size once done
350 clickedButton.width(buttonWidth);
351 clickedButton.height(buttonHeight);
353 if (screenOrientation === "portrait")
354 clickedButton.css({"right": buttonRight});
356 clickedButton.css({"bottom": buttonBottom});
360 $(".mainButton").fadeOut(300);
364 case ("mainMusicButton"):
365 currentPlayer = $("#audioPlayer");
366 currentPlayerControls = document.getElementById("audioPlayer");
367 currentPlayerType = "AUDIO";
368 currentContent = audioContent;
371 case ("mainVideoButton"):
372 currentPlayer = $("#videoPlayer");
373 currentPlayerControls = document.getElementById("videoPlayer");
374 currentPlayerType = "VIDEO";
375 currentContent = videoContent;
378 case ("mainImageButton"):
379 currentPlayer = $("#imagePlayer");
380 currentPlayerType = "IMAGE";
381 currentContent = imageContent;
385 console.log("Error: No menu by that name");
390 function showMainMenu()
394 $("#playButton").attr("src","images/playButton.png");
396 //If the media list is showing, hide it. Remove the mediaListAudioList class if it exists so that it will resize properly
397 if ($("#mediaList").is(":visible"))
398 $("#mediaList").fadeOut(300, function(){$("#mediaList").removeClass("mediaListAudioList");});
400 $(".navButton").fadeOut(300);
401 $(".sortButton").fadeOut(300);
402 $("#mediaName").fadeOut(300);
404 if (currentPlayerType !== "VIDEO")
405 currentPlayer.fadeOut(300);
407 currentPlayer.hide();
410 $(".mainButton").css({"opacity": "100"});
411 $(".mainButton").fadeIn(800);
414 function sortByAlpha(contentToSort)
416 //If contentToSort is undefined it's because the request came from the sortBy buttons
417 if (contentToSort === undefined)
418 contentToSort = audioContent;
420 contentToSort.sort(function (a,b) {
421 var first = a.title.toLowerCase();
422 var second = b.title.toLowerCase();
432 fillMediaList(contentToSort);
435 function sortByArtist(contentToSort)
437 if (contentToSort === undefined)
438 contentToSort = audioContent;
440 contentToSort.sort(function (a,b) {
441 var first = a.artists[0].toLowerCase();
442 var second = b.artists[0].toLowerCase();
452 fillMediaList(contentToSort);
455 function sortByAlbum(contentToSort)
457 if (contentToSort === undefined)
458 contentToSort = audioContent;
460 contentToSort.sort(function (a,b) {
461 var first = a.album.toLowerCase();
462 var second = b.album.toLowerCase();
472 fillMediaList(contentToSort);
474 /**************************************** NAVIGATION FUNCTIONS *******************************************/
476 function playButtonClick()
478 if (currentPlayerControls.paused)
480 currentPlayerControls.play();
481 $("#playButton").attr("src","images/pauseButton.png");
485 currentPlayerControls.pause();
486 $("#playButton").attr("src","images/playButton.png");
490 function backButtonClick()
492 switch (currentPlayerType)
500 listIndex = imageContent.length - 1;
503 $("#playButton").attr("src","images/playButton.png");
505 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
506 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
516 videoIndex = imageContent.length - 1;
518 if ($("#mediaList").is(":visible"))
520 $("#playButton").attr("src","images/playButton.png");
521 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
531 imageIndex = imageContent.length - 1;
533 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
534 $("#imagePlayer").css("background-size", "contain");
538 console.log("Content failure");
544 function nextButtonClick()
546 switch (currentPlayerType)
551 if (audioContent.length > (listIndex + 1))
557 $("#playButton").attr("src","images/playButton.png");
559 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
560 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
567 if (videoContent.length > (videoIndex + 1))
573 $("#playButton").attr("src","images/playButton.png");
575 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
582 if (imageContent.length > (imageIndex + 1))
587 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
588 $("#imagePlayer").css("background-size", "contain");
592 console.log("Content failure");
597 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
599 function resizeMainMenu()
601 $("#mediaList").fadeOut(0);
602 screenWidth = window.innerWidth;
603 screenHeight = window.innerHeight;
604 screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
605 iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
608 $(".mainButton").width(iconWidth + "px");
609 $(".mainButton").height(iconWidth + "px");
611 var iconsTop = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
613 if (screenOrientation === "portrait")
614 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
616 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - (padding * 3)) + "px", "width" : "100%"});
619 function resizePlayerPage()
621 audioPlayer = document.getElementById("audioPlayer");
622 videoPlayer = document.getElementById("videoPlayer");
623 screenWidth = window.innerWidth;
624 screenHeight = window.innerHeight;
627 var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
629 $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
630 $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
631 $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
632 $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
633 $("#playButton").css({"width": buttonWidth * 1.3 + "px", "height": buttonWidth * 1.3 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
635 mediaNameCanvas.width = (screenWidth);
636 mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
637 mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
638 mediaNameCanvas.style.left = "0px";
640 var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
641 var sortButtonWidth = buttonWidth * 2.5;
642 var buttonSpacing = screenWidth / 5;
643 $(".player").css({"height": (screenHeight - (buttonWidth * 2) - (padding * 2)) + "px", "top": buttonWidth + padding + "px"});
653 * swipe - Handles swipe events. Currently it just acts as another way to hit the next / back buttons, but
654 * it could be expanded to other things in the future.
657 function swipe(direction, object)
663 if (direction === "right")
665 else if (direction === "left")
676 vidIcon.src = "images/videoButton.png";
677 imgIcon.src = "images/imageButton.png";
679 mediaNameCanvas = document.getElementById("mediaName");
680 mediaNameCTX = mediaNameCanvas.getContext("2d");
682 //Resize all items and search for local media
684 getMedia(contentType);
686 //Prevent highlighting
687 window.ondragstart = function() { return false; }
689 $(window).bind('resize', resizeAll);
691 //Simple swipe detection
692 $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
693 $("#mediaName").mouseup(function(e){
694 if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
696 if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
698 if (mouseDownEvent.clientX > e.clientX)
699 swipe("left", "mediaName");
701 swipe("right", "mediaName");
707 $(document).ready(function () {